diff --git a/.gitignore b/.gitignore index f4bcd35c32ae..aaea45ce985a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ *.apmc *.apz5 *.aptloz +*.apemerald *.pyc *.pyd *.sfc diff --git a/BaseClasses.py b/BaseClasses.py index a70dd70a9238..b25d998311a1 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -113,6 +113,11 @@ def extend(self, regions: Iterable[Region]): for region in regions: self.region_cache[region.player][region.name] = region + def add_group(self, new_id: int): + self.region_cache[new_id] = {} + self.entrance_cache[new_id] = {} + self.location_cache[new_id] = {} + def __iter__(self) -> Iterator[Region]: for regions in self.region_cache.values(): yield from regions.values() @@ -220,6 +225,7 @@ def add_group(self, name: str, game: str, players: Set[int] = frozenset()) -> Tu return group_id, group new_id: int = self.players + len(self.groups) + 1 + self.regions.add_group(new_id) self.game[new_id] = game self.player_types[new_id] = NetUtils.SlotType.group world_type = AutoWorld.AutoWorldRegister.world_types[game] @@ -617,7 +623,7 @@ class CollectionState(): additional_copy_functions: List[Callable[[CollectionState, CollectionState], CollectionState]] = [] def __init__(self, parent: MultiWorld): - self.prog_items = {player: Counter() for player in parent.player_ids} + self.prog_items = {player: Counter() for player in parent.get_all_ids()} self.multiworld = parent self.reachable_regions = {player: set() for player in parent.get_all_ids()} self.blocked_connections = {player: set() for player in parent.get_all_ids()} @@ -711,11 +717,11 @@ def sweep_for_events(self, key_only: bool = False, locations: Optional[Iterable[ def has(self, item: str, player: int, count: int = 1) -> bool: return self.prog_items[player][item] >= count - def has_all(self, items: Set[str], player: int) -> bool: + 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) - def has_any(self, items: Set[str], player: int) -> bool: + 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) @@ -724,16 +730,18 @@ def count(self, item: str, player: int) -> int: def has_group(self, item_name_group: str, player: int, count: int = 1) -> bool: found: int = 0 + player_prog_items = self.prog_items[player] for item_name in self.multiworld.worlds[player].item_name_groups[item_name_group]: - found += self.prog_items[player][item_name] + found += player_prog_items[item_name] if found >= count: return True return False def count_group(self, item_name_group: str, player: int) -> int: found: int = 0 + player_prog_items = self.prog_items[player] for item_name in self.multiworld.worlds[player].item_name_groups[item_name_group]: - found += self.prog_items[player][item_name] + found += player_prog_items[item_name] return found def item_count(self, item: str, player: int) -> int: diff --git a/CommonClient.py b/CommonClient.py index a5e9b4553ab4..c4d80f341611 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -737,7 +737,8 @@ async def process_server_cmd(ctx: CommonContext, args: dict): elif 'InvalidGame' in errors: ctx.event_invalid_game() elif 'IncompatibleVersion' in errors: - raise Exception('Server reported your client version as incompatible') + raise Exception('Server reported your client version as incompatible. ' + 'This probably means you have to update.') elif 'InvalidItemsHandling' in errors: raise Exception('The item handling flags requested by the client are not supported') # last to check, recoverable problem @@ -758,6 +759,7 @@ async def process_server_cmd(ctx: CommonContext, args: dict): ctx.slot_info = {int(pid): data for pid, data in args["slot_info"].items()} ctx.hint_points = args.get("hint_points", 0) ctx.consume_players_package(args["players"]) + ctx.stored_data_notification_keys.add(f"_read_hints_{ctx.team}_{ctx.slot}") msgs = [] if ctx.locations_checked: msgs.append({"cmd": "LocationChecks", @@ -836,10 +838,14 @@ async def process_server_cmd(ctx: CommonContext, args: dict): elif cmd == "Retrieved": ctx.stored_data.update(args["keys"]) + if ctx.ui and f"_read_hints_{ctx.team}_{ctx.slot}" in args["keys"]: + ctx.ui.update_hints() elif cmd == "SetReply": ctx.stored_data[args["key"]] = args["value"] - if args["key"].startswith("EnergyLink"): + if ctx.ui and f"_read_hints_{ctx.team}_{ctx.slot}" == args["key"]: + ctx.ui.update_hints() + elif args["key"].startswith("EnergyLink"): ctx.current_energy_link_value = args["value"] if ctx.ui: ctx.ui.set_new_energy_link_value() diff --git a/Fill.py b/Fill.py index c9660ab708ca..9fdbcc384392 100644 --- a/Fill.py +++ b/Fill.py @@ -112,7 +112,7 @@ def fill_restrictive(world: MultiWorld, base_state: CollectionState, locations: location.item = None placed_item.location = None - swap_state = sweep_from_pool(base_state, [placed_item] if unsafe else []) + swap_state = sweep_from_pool(base_state, [placed_item, *item_pool] if unsafe else item_pool) # unsafe means swap_state assumes we can somehow collect placed_item before item_to_place # by continuing to swap, which is not guaranteed. This is unsafe because there is no mechanic # to clean that up later, so there is a chance generation fails. diff --git a/Main.py b/Main.py index 691b88b13706..568bf0208f78 100644 --- a/Main.py +++ b/Main.py @@ -265,7 +265,7 @@ def find_common_pool(players: Set[int], shared_pool: Set[str]) -> Tuple[ if any(world.item_links.values()): world._all_state = None - logger.info("Running Item Plando") + logger.info("Running Item Plando.") distribute_planned(world) @@ -354,6 +354,9 @@ def precollect_hint(location): assert location.item.code is not None, "item code None should be event, " \ "location.address should then also be None. Location: " \ f" {location}" + assert location.address not in locations_data[location.player], ( + f"Locations with duplicate address. {location} and " + f"{locations_data[location.player][location.address]}") locations_data[location.player][location.address] = \ location.item.code, location.item.player, location.item.flags if location.name in world.worlds[location.player].options.start_location_hints: diff --git a/README.md b/README.md index 4c733a67b46b..49defcafd245 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,8 @@ Currently, the following games are supported: * Muse Dash * DOOM 1993 * Terraria +* Lingo +* Pokémon Emerald 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/UndertaleClient.py b/UndertaleClient.py index 62fbe128bdb9..e1538ce81d2e 100644 --- a/UndertaleClient.py +++ b/UndertaleClient.py @@ -27,14 +27,14 @@ def _cmd_resync(self): self.ctx.syncing = True def _cmd_patch(self): - """Patch the game.""" + """Patch the game. Only use this command if /auto_patch fails.""" if isinstance(self.ctx, UndertaleContext): os.makedirs(name=os.path.join(os.getcwd(), "Undertale"), exist_ok=True) self.ctx.patch_game() self.output("Patched.") def _cmd_savepath(self, directory: str): - """Redirect to proper save data folder. (Use before connecting!)""" + """Redirect to proper save data folder. This is necessary for Linux users to use before connecting.""" if isinstance(self.ctx, UndertaleContext): self.ctx.save_game_folder = directory self.output("Changed to the following directory: " + self.ctx.save_game_folder) @@ -67,7 +67,7 @@ def _cmd_auto_patch(self, steaminstall: typing.Optional[str] = None): self.output("Patching successful!") def _cmd_online(self): - """Makes you no longer able to see other Undertale players.""" + """Toggles seeing other Undertale players.""" if isinstance(self.ctx, UndertaleContext): self.ctx.update_online_mode(not ("Online" in self.ctx.tags)) if "Online" in self.ctx.tags: diff --git a/WargrooveClient.py b/WargrooveClient.py index 16bfeb15ab6b..77180502cefc 100644 --- a/WargrooveClient.py +++ b/WargrooveClient.py @@ -113,6 +113,9 @@ async def server_auth(self, password_requested: bool = False): async def connection_closed(self): await super(WargrooveContext, self).connection_closed() self.remove_communication_files() + self.checked_locations.clear() + self.server_locations.clear() + self.finished_game = False @property def endpoints(self): @@ -124,6 +127,9 @@ def endpoints(self): async def shutdown(self): await super(WargrooveContext, self).shutdown() self.remove_communication_files() + self.checked_locations.clear() + self.server_locations.clear() + self.finished_game = False def remove_communication_files(self): for root, dirs, files in os.walk(self.game_communication_path): @@ -402,8 +408,10 @@ async def game_watcher(ctx: WargrooveContext): if file.find("send") > -1: st = file.split("send", -1)[1] sending = sending+[(int(st))] + os.remove(os.path.join(ctx.game_communication_path, file)) if file.find("victory") > -1: victory = True + os.remove(os.path.join(ctx.game_communication_path, file)) ctx.locations_checked = sending message = [{"cmd": 'LocationChecks', "locations": sending}] await ctx.send_msgs(message) diff --git a/WebHostLib/customserver.py b/WebHostLib/customserver.py index 6d633314b2be..998fec5e738d 100644 --- a/WebHostLib/customserver.py +++ b/WebHostLib/customserver.py @@ -27,8 +27,10 @@ class CustomClientMessageProcessor(ClientMessageProcessor): ctx: WebHostContext - def _cmd_video(self, platform, user): - """Set a link for your name in the WebHostLib tracker pointing to a video stream""" + def _cmd_video(self, platform: str, user: str): + """Set a link for your name in the WebHostLib tracker pointing to a video stream. + Currently, only YouTube and Twitch platforms are supported. + """ if platform.lower().startswith("t"): # twitch self.ctx.video[self.client.team, self.client.slot] = "Twitch", user self.ctx.save() diff --git a/WebHostLib/options.py b/WebHostLib/options.py index 1a2aab6d883d..4d17c7fdde19 100644 --- a/WebHostLib/options.py +++ b/WebHostLib/options.py @@ -3,11 +3,8 @@ import os import typing -import yaml -from jinja2 import Template - import Options -from Utils import __version__, local_path +from Utils import local_path from worlds.AutoWorld import AutoWorldRegister handled_in_js = {"start_inventory", "local_items", "non_local_items", "start_hints", "start_location_hints", @@ -28,7 +25,7 @@ def get_html_doc(option_type: type(Options.Option)) -> str: weighted_options = { "baseOptions": { "description": "Generated by https://archipelago.gg/", - "name": "Player", + "name": "", "game": {}, }, "games": {}, @@ -43,7 +40,7 @@ def get_html_doc(option_type: type(Options.Option)) -> str: "baseOptions": { "description": f"Generated by https://archipelago.gg/ for {game_name}", "game": game_name, - "name": "Player", + "name": "", }, } @@ -117,10 +114,46 @@ def get_html_doc(option_type: type(Options.Option)) -> str: } else: - logging.debug(f"{option} not exported to Web options.") + logging.debug(f"{option} not exported to Web Options.") player_options["gameOptions"] = game_options + player_options["presetOptions"] = {} + for preset_name, preset in world.web.options_presets.items(): + player_options["presetOptions"][preset_name] = {} + for option_name, option_value in preset.items(): + # Random range type settings are not valid. + assert (not str(option_value).startswith("random-")), \ + f"Invalid preset value '{option_value}' for '{option_name}' in '{preset_name}'. Special random " \ + f"values are not supported for presets." + + # Normal random is supported, but needs to be handled explicitly. + if option_value == "random": + player_options["presetOptions"][preset_name][option_name] = option_value + continue + + option = world.options_dataclass.type_hints[option_name].from_any(option_value) + if isinstance(option, Options.SpecialRange) and isinstance(option_value, str): + assert option_value in option.special_range_names, \ + f"Invalid preset value '{option_value}' for '{option_name}' in '{preset_name}'. " \ + f"Expected {option.special_range_names.keys()} or {option.range_start}-{option.range_end}." + + # Still use the true value for the option, not the name. + player_options["presetOptions"][preset_name][option_name] = option.value + elif isinstance(option, Options.Range): + player_options["presetOptions"][preset_name][option_name] = option.value + elif isinstance(option_value, str): + # For Choice and Toggle options, the value should be the name of the option. This is to prevent + # setting a preset for an option with an overridden from_text method that would normally be okay, + # but would not be okay for the webhost's current implementation of player options UI. + assert option.name_lookup[option.value] == option_value, \ + f"Invalid option value '{option_value}' for '{option_name}' in preset '{preset_name}'. " \ + f"Values must not be resolved to a different option via option.from_text (or an alias)." + player_options["presetOptions"][preset_name][option_name] = option.current_key + else: + # int and bool values are fine, just resolve them to the current key for webhost. + player_options["presetOptions"][preset_name][option_name] = option.current_key + os.makedirs(os.path.join(target_folder, 'player-options'), exist_ok=True) with open(os.path.join(target_folder, 'player-options', game_name + ".json"), "w") as f: @@ -136,16 +169,20 @@ def get_html_doc(option_type: type(Options.Option)) -> str: option["defaultValue"] = "random" weighted_options["baseOptions"]["game"][game_name] = 0 - weighted_options["games"][game_name] = {} - weighted_options["games"][game_name]["gameSettings"] = game_options - weighted_options["games"][game_name]["gameItems"] = tuple(world.item_names) - weighted_options["games"][game_name]["gameItemGroups"] = [ - group for group in world.item_name_groups.keys() if group != "Everything" - ] - weighted_options["games"][game_name]["gameLocations"] = tuple(world.location_names) - weighted_options["games"][game_name]["gameLocationGroups"] = [ - group for group in world.location_name_groups.keys() if group != "Everywhere" - ] + weighted_options["games"][game_name] = { + "gameSettings": game_options, + "gameItems": tuple(world.item_names), + "gameItemGroups": [ + group for group in world.item_name_groups.keys() if group != "Everything" + ], + "gameItemDescriptions": world.item_descriptions, + "gameLocations": tuple(world.location_names), + "gameLocationGroups": [ + group for group in world.location_name_groups.keys() if group != "Everywhere" + ], + "gameLocationDescriptions": world.location_descriptions, + } with open(os.path.join(target_folder, 'weighted-options.json'), "w") as f: json.dump(weighted_options, f, indent=2, separators=(',', ': ')) + diff --git a/WebHostLib/static/assets/player-options.js b/WebHostLib/static/assets/player-options.js index 727e0f63b967..54fae2909a99 100644 --- a/WebHostLib/static/assets/player-options.js +++ b/WebHostLib/static/assets/player-options.js @@ -16,8 +16,9 @@ window.addEventListener('load', () => { } if (optionHash !== md5(JSON.stringify(results))) { - showUserMessage("Your options are out of date! Click here to update them! Be aware this will reset " + - "them all to default."); + showUserMessage( + 'Your options are out of date! Click here to update them! Be aware this will reset them all to default.' + ); document.getElementById('user-message').addEventListener('click', resetOptions); } @@ -36,6 +37,17 @@ window.addEventListener('load', () => { const nameInput = document.getElementById('player-name'); nameInput.addEventListener('keyup', (event) => updateBaseOption(event)); nameInput.value = playerOptions.name; + + // Presets + const presetSelect = document.getElementById('game-options-preset'); + presetSelect.addEventListener('change', (event) => setPresets(results, event.target.value)); + for (const preset in results['presetOptions']) { + const presetOption = document.createElement('option'); + presetOption.innerText = preset; + presetSelect.appendChild(presetOption); + } + presetSelect.value = localStorage.getItem(`${gameName}-preset`); + results['presetOptions']['__default'] = {}; }).catch((e) => { console.error(e); const url = new URL(window.location.href); @@ -45,7 +57,8 @@ window.addEventListener('load', () => { const resetOptions = () => { localStorage.removeItem(gameName); - localStorage.removeItem(`${gameName}-hash`) + localStorage.removeItem(`${gameName}-hash`); + localStorage.removeItem(`${gameName}-preset`); window.location.reload(); }; @@ -77,6 +90,10 @@ const createDefaultOptions = (optionData) => { } localStorage.setItem(gameName, JSON.stringify(newOptions)); } + + if (!localStorage.getItem(`${gameName}-preset`)) { + localStorage.setItem(`${gameName}-preset`, '__default'); + } }; const buildUI = (optionData) => { @@ -84,8 +101,11 @@ const buildUI = (optionData) => { const leftGameOpts = {}; const rightGameOpts = {}; Object.keys(optionData.gameOptions).forEach((key, index) => { - if (index < Object.keys(optionData.gameOptions).length / 2) { leftGameOpts[key] = optionData.gameOptions[key]; } - else { rightGameOpts[key] = optionData.gameOptions[key]; } + if (index < Object.keys(optionData.gameOptions).length / 2) { + leftGameOpts[key] = optionData.gameOptions[key]; + } else { + rightGameOpts[key] = optionData.gameOptions[key]; + } }); document.getElementById('game-options-left').appendChild(buildOptionsTable(leftGameOpts)); document.getElementById('game-options-right').appendChild(buildOptionsTable(rightGameOpts)); @@ -120,7 +140,7 @@ const buildOptionsTable = (options, romOpts = false) => { const randomButton = document.createElement('button'); - switch(options[option].type){ + switch(options[option].type) { case 'select': element = document.createElement('div'); element.classList.add('select-container'); @@ -129,16 +149,17 @@ const buildOptionsTable = (options, romOpts = false) => { select.setAttribute('data-key', option); if (romOpts) { select.setAttribute('data-romOpt', '1'); } options[option].options.forEach((opt) => { - const option = document.createElement('option'); - option.setAttribute('value', opt.value); - option.innerText = opt.name; + const optionElement = document.createElement('option'); + optionElement.setAttribute('value', opt.value); + optionElement.innerText = opt.name; + if ((isNaN(currentOptions[gameName][option]) && (parseInt(opt.value, 10) === parseInt(currentOptions[gameName][option]))) || (opt.value === currentOptions[gameName][option])) { - option.selected = true; + optionElement.selected = true; } - select.appendChild(option); + select.appendChild(optionElement); }); select.addEventListener('change', (event) => updateGameOption(event.target)); element.appendChild(select); @@ -162,6 +183,7 @@ const buildOptionsTable = (options, romOpts = false) => { element.classList.add('range-container'); let range = document.createElement('input'); + range.setAttribute('id', option); range.setAttribute('type', 'range'); range.setAttribute('data-key', option); range.setAttribute('min', options[option].min); @@ -205,11 +227,11 @@ const buildOptionsTable = (options, romOpts = false) => { let presetOption = document.createElement('option'); presetOption.innerText = presetName; presetOption.value = options[option].value_names[presetName]; - const words = presetOption.innerText.split("_"); + const words = presetOption.innerText.split('_'); for (let i = 0; i < words.length; i++) { words[i] = words[i][0].toUpperCase() + words[i].substring(1); } - presetOption.innerText = words.join(" "); + presetOption.innerText = words.join(' '); specialRangeSelect.appendChild(presetOption); }); let customOption = document.createElement('option'); @@ -294,6 +316,90 @@ const buildOptionsTable = (options, romOpts = false) => { return table; }; +const setPresets = (optionsData, presetName) => { + const defaults = optionsData['gameOptions']; + const preset = optionsData['presetOptions'][presetName]; + + localStorage.setItem(`${gameName}-preset`, presetName); + + if (!preset) { + console.error(`No presets defined for preset name: '${presetName}'`); + return; + } + + const updateOptionElement = (option, presetValue) => { + const optionElement = document.querySelector(`#${option}[data-key='${option}']`); + const randomElement = document.querySelector(`.randomize-button[data-key='${option}']`); + + if (presetValue === 'random') { + randomElement.classList.add('active'); + optionElement.disabled = true; + updateGameOption(randomElement, false); + } else { + optionElement.value = presetValue; + randomElement.classList.remove('active'); + optionElement.disabled = undefined; + updateGameOption(optionElement, false); + } + }; + + for (const option in defaults) { + let presetValue = preset[option]; + if (presetValue === undefined) { + // Using the default value if not set in presets. + presetValue = defaults[option]['defaultValue']; + } + + switch (defaults[option].type) { + case 'range': + const numberElement = document.querySelector(`#${option}-value`); + if (presetValue === 'random') { + numberElement.innerText = defaults[option]['defaultValue'] === 'random' + ? defaults[option]['min'] // A fallback so we don't print 'random' in the UI. + : defaults[option]['defaultValue']; + } else { + numberElement.innerText = presetValue; + } + + updateOptionElement(option, presetValue); + break; + + case 'select': { + updateOptionElement(option, presetValue); + break; + } + + case 'special_range': { + const selectElement = document.querySelector(`select[data-key='${option}']`); + const rangeElement = document.querySelector(`input[data-key='${option}']`); + const randomElement = document.querySelector(`.randomize-button[data-key='${option}']`); + + if (presetValue === 'random') { + randomElement.classList.add('active'); + selectElement.disabled = true; + rangeElement.disabled = true; + updateGameOption(randomElement, false); + } else { + rangeElement.value = presetValue; + selectElement.value = Object.values(defaults[option]['value_names']).includes(parseInt(presetValue)) ? + parseInt(presetValue) : 'custom'; + document.getElementById(`${option}-value`).innerText = presetValue; + + randomElement.classList.remove('active'); + selectElement.disabled = undefined; + rangeElement.disabled = undefined; + updateGameOption(rangeElement, false); + } + break; + } + + default: + console.warn(`Ignoring preset value for unknown option type: ${defaults[option].type} with name ${option}`); + break; + } + } +}; + const toggleRandomize = (event, inputElement, optionalSelectElement = null) => { const active = event.target.classList.contains('active'); const randomButton = event.target; @@ -321,8 +427,15 @@ const updateBaseOption = (event) => { localStorage.setItem(gameName, JSON.stringify(options)); }; -const updateGameOption = (optionElement) => { +const updateGameOption = (optionElement, toggleCustomPreset = true) => { const options = JSON.parse(localStorage.getItem(gameName)); + + if (toggleCustomPreset) { + localStorage.setItem(`${gameName}-preset`, '__custom'); + const presetElement = document.getElementById('game-options-preset'); + presetElement.value = '__custom'; + } + if (optionElement.classList.contains('randomize-button')) { // If the event passed in is the randomize button, then we know what we must do. options[gameName][optionElement.getAttribute('data-key')] = 'random'; @@ -336,7 +449,21 @@ const updateGameOption = (optionElement) => { const exportOptions = () => { const options = JSON.parse(localStorage.getItem(gameName)); - if (!options.name || options.name.toLowerCase() === 'player' || options.name.trim().length === 0) { + const preset = localStorage.getItem(`${gameName}-preset`); + switch (preset) { + case '__default': + options['description'] = `Generated by https://archipelago.gg with the default preset.`; + break; + + case '__custom': + options['description'] = `Generated by https://archipelago.gg.`; + break; + + default: + options['description'] = `Generated by https://archipelago.gg with the ${preset} preset.`; + } + + if (!options.name || options.name.trim().length === 0) { return showUserMessage('You must enter a player name!'); } const yamlText = jsyaml.safeDump(options, { noCompatMode: true }).replaceAll(/'(\d+)':/g, (x, y) => `${y}:`); diff --git a/WebHostLib/static/assets/trackerCommon.js b/WebHostLib/static/assets/trackerCommon.js index 41c4020dace8..b8e089ece5d3 100644 --- a/WebHostLib/static/assets/trackerCommon.js +++ b/WebHostLib/static/assets/trackerCommon.js @@ -4,13 +4,20 @@ const adjustTableHeight = () => { return; const upperDistance = tablesContainer.getBoundingClientRect().top; - const containerHeight = window.innerHeight - upperDistance; - tablesContainer.style.maxHeight = `calc(${containerHeight}px - 1rem)`; - const tableWrappers = document.getElementsByClassName('table-wrapper'); - for(let i=0; i < tableWrappers.length; i++){ - const maxHeight = (window.innerHeight - upperDistance) / 2; - tableWrappers[i].style.maxHeight = `calc(${maxHeight}px - 1rem)`; + for (let i = 0; i < tableWrappers.length; i++) { + // Ensure we are starting from maximum size prior to calculation. + tableWrappers[i].style.height = null; + tableWrappers[i].style.maxHeight = null; + + // Set as a reasonable height, but still allows the user to resize element if they desire. + const currentHeight = tableWrappers[i].offsetHeight; + const maxHeight = (window.innerHeight - upperDistance) / Math.min(tableWrappers.length, 4); + if (currentHeight > maxHeight) { + tableWrappers[i].style.height = `calc(${maxHeight}px - 1rem)`; + } + + tableWrappers[i].style.maxHeight = `${currentHeight}px`; } }; @@ -55,7 +62,7 @@ window.addEventListener('load', () => { render: function (data, type, row) { if (type === "sort" || type === 'type') { if (data === "None") - return -1; + return Number.MAX_VALUE; return parseInt(data); } diff --git a/WebHostLib/static/assets/weighted-options.js b/WebHostLib/static/assets/weighted-options.js index 3811bd42bac9..34dfbae4bbee 100644 --- a/WebHostLib/static/assets/weighted-options.js +++ b/WebHostLib/static/assets/weighted-options.js @@ -1024,12 +1024,18 @@ class GameSettings { // Builds a div for a setting whose value is a list of locations. #buildLocationsDiv(setting) { - return this.#buildListDiv(setting, this.data.gameLocations, this.data.gameLocationGroups); + return this.#buildListDiv(setting, this.data.gameLocations, { + groups: this.data.gameLocationGroups, + descriptions: this.data.gameLocationDescriptions, + }); } // Builds a div for a setting whose value is a list of items. #buildItemsDiv(setting) { - return this.#buildListDiv(setting, this.data.gameItems, this.data.gameItemGroups); + return this.#buildListDiv(setting, this.data.gameItems, { + groups: this.data.gameItemGroups, + descriptions: this.data.gameItemDescriptions + }); } // Builds a div for a setting named `setting` with a list value that can @@ -1038,12 +1044,15 @@ class GameSettings { // The `groups` option can be a list of additional options for this list // (usually `item_name_groups` or `location_name_groups`) that are displayed // in a special section at the top of the list. - #buildListDiv(setting, items, groups = []) { + // + // The `descriptions` option can be a map from item names or group names to + // descriptions for the user's benefit. + #buildListDiv(setting, items, {groups = [], descriptions = {}} = {}) { const div = document.createElement('div'); div.classList.add('simple-list'); groups.forEach((group) => { - const row = this.#addListRow(setting, group); + const row = this.#addListRow(setting, group, descriptions[group]); div.appendChild(row); }); @@ -1052,7 +1061,7 @@ class GameSettings { } items.forEach((item) => { - const row = this.#addListRow(setting, item); + const row = this.#addListRow(setting, item, descriptions[item]); div.appendChild(row); }); @@ -1060,7 +1069,9 @@ class GameSettings { } // Builds and returns a row for a list of checkboxes. - #addListRow(setting, item) { + // + // If `help` is passed, it's displayed as a help tooltip for this list item. + #addListRow(setting, item, help = undefined) { const row = document.createElement('div'); row.classList.add('list-row'); @@ -1081,6 +1092,23 @@ class GameSettings { const name = document.createElement('span'); name.innerText = item; + + if (help) { + const helpSpan = document.createElement('span'); + helpSpan.classList.add('interactive'); + helpSpan.setAttribute('data-tooltip', help); + helpSpan.innerText = '(?)'; + name.innerText += ' '; + name.appendChild(helpSpan); + + // Put the first 7 tooltips below their rows. CSS tooltips in scrolling + // containers can't be visible outside those containers, so this helps + // ensure they won't be pushed out the top. + if (helpSpan.parentNode.childNodes.length < 7) { + helpSpan.classList.add('tooltip-bottom'); + } + } + label.appendChild(name); row.appendChild(label); diff --git a/WebHostLib/static/styles/player-options.css b/WebHostLib/static/styles/player-options.css index 2f5481d2857f..7d6a19709a93 100644 --- a/WebHostLib/static/styles/player-options.css +++ b/WebHostLib/static/styles/player-options.css @@ -90,6 +90,31 @@ html{ flex-direction: row; } +#player-options #meta-options { + display: flex; + justify-content: space-between; + gap: 20px; + padding: 3px; +} + +#player-options div { + display: flex; + flex-grow: 1; +} + +#player-options #meta-options label { + display: inline-block; + min-width: 180px; + flex-grow: 1; +} + +#player-options #meta-options input, +#player-options #meta-options select { + box-sizing: border-box; + min-width: 150px; + width: 50%; +} + #player-options .left, #player-options .right{ flex-grow: 1; } @@ -188,6 +213,12 @@ html{ border-radius: 0; } + #player-options #meta-options { + flex-direction: column; + justify-content: flex-start; + gap: 6px; + } + #player-options #game-options{ justify-content: flex-start; flex-wrap: wrap; diff --git a/WebHostLib/static/styles/tracker.css b/WebHostLib/static/styles/tracker.css index 0cc2ede59fe3..8fcb0c923012 100644 --- a/WebHostLib/static/styles/tracker.css +++ b/WebHostLib/static/styles/tracker.css @@ -7,81 +7,119 @@ width: calc(100% - 1rem); } -#tracker-wrapper a{ +#tracker-wrapper a { color: #234ae4; text-decoration: none; cursor: pointer; } -.table-wrapper{ - overflow-y: auto; - overflow-x: auto; - margin-bottom: 1rem; -} - -#tracker-header-bar{ +#tracker-header-bar { display: flex; flex-direction: row; justify-content: flex-start; + align-content: center; line-height: 20px; + gap: 0.5rem; + margin-bottom: 1rem; } -#tracker-header-bar .info{ +#tracker-header-bar .info { color: #ffffff; + padding: 2px; + flex-grow: 1; + align-self: center; + text-align: justify; +} + +#tracker-navigation { + display: flex; + flex-wrap: wrap; + margin: 0 0.5rem 0.5rem 0.5rem; + user-select: none; + height: 2rem; +} + +.tracker-navigation-bar { + display: flex; + background-color: #b0a77d; + border-radius: 4px; +} + +.tracker-navigation-button { + display: flex; + justify-content: center; + align-items: center; + margin: 4px; + padding-left: 12px; + padding-right: 12px; + border-radius: 4px; + text-align: center; + font-size: 14px; + color: black !important; + font-weight: lighter; +} + +.tracker-navigation-button:hover { + background-color: #e2eabb !important; +} + +.tracker-navigation-button.selected { + background-color: rgb(220, 226, 189); +} + +.table-wrapper { + overflow-y: auto; + overflow-x: auto; + margin-bottom: 1rem; + resize: vertical; } -#search{ +#search { border: 1px solid #000000; border-radius: 3px; padding: 3px; width: 200px; - margin-bottom: 0.5rem; - margin-right: 1rem; -} - -#multi-stream-link{ - margin-right: 1rem; } -div.dataTables_wrapper.no-footer .dataTables_scrollBody{ +div.dataTables_wrapper.no-footer .dataTables_scrollBody { border: none; } -table.dataTable{ +table.dataTable { color: #000000; } -table.dataTable thead{ +table.dataTable thead { font-family: LexendDeca-Regular, sans-serif; } -table.dataTable tbody, table.dataTable tfoot{ +table.dataTable tbody, table.dataTable tfoot { background-color: #dce2bd; font-family: LexendDeca-Light, sans-serif; } -table.dataTable tbody tr:hover, table.dataTable tfoot tr:hover{ +table.dataTable tbody tr:hover, table.dataTable tfoot tr:hover { background-color: #e2eabb; } -table.dataTable tbody td, table.dataTable tfoot td{ +table.dataTable tbody td, table.dataTable tfoot td { padding: 4px 6px; } -table.dataTable, table.dataTable.no-footer{ +table.dataTable, table.dataTable.no-footer { border-left: 1px solid #bba967; width: calc(100% - 2px) !important; font-size: 1rem; } -table.dataTable thead th{ +table.dataTable thead th { position: -webkit-sticky; position: sticky; background-color: #b0a77d; top: 0; } -table.dataTable thead th.upper-row{ +table.dataTable thead th.upper-row { position: -webkit-sticky; position: sticky; background-color: #b0a77d; @@ -89,7 +127,7 @@ table.dataTable thead th.upper-row{ top: 0; } -table.dataTable thead th.lower-row{ +table.dataTable thead th.lower-row { position: -webkit-sticky; position: sticky; background-color: #b0a77d; @@ -97,59 +135,32 @@ table.dataTable thead th.lower-row{ top: 46px; } -table.dataTable tbody td, table.dataTable tfoot td{ +table.dataTable tbody td, table.dataTable tfoot td { border: 1px solid #bba967; } -table.dataTable tfoot td{ +table.dataTable tfoot td { font-weight: bold; } -div.dataTables_scrollBody{ +div.dataTables_scrollBody { background-color: inherit !important; } -table.dataTable .center-column{ +table.dataTable .center-column { text-align: center; } -img.alttp-sprite { +img.icon-sprite { height: auto; max-height: 32px; min-height: 14px; } -.item-acquired{ +.item-acquired { background-color: #d3c97d; } -#tracker-navigation { - display: inline-flex; - background-color: #b0a77d; - margin: 0.5rem; - border-radius: 4px; -} - -.tracker-navigation-button { - display: block; - margin: 4px; - padding-left: 12px; - padding-right: 12px; - border-radius: 4px; - text-align: center; - font-size: 14px; - color: #000; - font-weight: lighter; -} - -.tracker-navigation-button:hover { - background-color: #e2eabb !important; -} - -.tracker-navigation-button.selected { - background-color: rgb(220, 226, 189); -} - @media all and (max-width: 1700px) { table.dataTable thead th.upper-row{ position: -webkit-sticky; @@ -159,7 +170,7 @@ img.alttp-sprite { top: 0; } - table.dataTable thead th.lower-row{ + table.dataTable thead th.lower-row { position: -webkit-sticky; position: sticky; background-color: #b0a77d; @@ -167,11 +178,11 @@ img.alttp-sprite { top: 37px; } - table.dataTable, table.dataTable.no-footer{ + table.dataTable, table.dataTable.no-footer { font-size: 0.8rem; } - img.alttp-sprite { + img.icon-sprite { height: auto; max-height: 24px; min-height: 10px; @@ -187,7 +198,7 @@ img.alttp-sprite { top: 0; } - table.dataTable thead th.lower-row{ + table.dataTable thead th.lower-row { position: -webkit-sticky; position: sticky; background-color: #b0a77d; @@ -195,11 +206,11 @@ img.alttp-sprite { top: 32px; } - table.dataTable, table.dataTable.no-footer{ + table.dataTable, table.dataTable.no-footer { font-size: 0.6rem; } - img.alttp-sprite { + img.icon-sprite { height: auto; max-height: 20px; min-height: 10px; diff --git a/WebHostLib/templates/genericTracker.html b/WebHostLib/templates/genericTracker.html index 1c2fcd44c0dd..5a533204083b 100644 --- a/WebHostLib/templates/genericTracker.html +++ b/WebHostLib/templates/genericTracker.html @@ -1,36 +1,57 @@ -{% extends 'tablepage.html' %} +{% extends "tablepage.html" %} {% block head %} {{ super() }} {{ player_name }}'s Tracker - - - + + + {% endblock %} {% block body %} - {% include 'header/dirtHeader.html' %} -
+ {% include "header/dirtHeader.html" %} + +
+
+ + 🡸 Return to Multiworld Tracker + + {% if game_specific_tracker %} + + Game-Specific Tracker + + {% endif %} +
+
+ +
- - This tracker will automatically update itself periodically. + +
This tracker will automatically update itself periodically.
+
- + - {% for id, count in inventory.items() %} - - - - - + {% for id, count in inventory.items() if count > 0 %} + + + + + {%- endfor -%} @@ -39,24 +60,62 @@
Item AmountOrder ReceivedLast Order Received
{{ id | item_name }}{{ count }}{{received_items[id]}}
{{ item_id_to_name[game][id] }}{{ count }}{{ received_items[id] }}
- - - - + + + + - {% for name in checked_locations %} + + {%- for location in locations -%} + + + + + {%- endfor -%} + + +
LocationChecked
LocationChecked
{{ location_id_to_name[game][location] }} + {% if location in checked_locations %}✔{% endif %} +
+
+
+ + - - + + + + + + + - {%- endfor -%} - {% for name in not_checked_locations %} + + + {%- for hint in hints -%} - - + + + + + + + - {%- endfor -%} + {%- endfor -%}
{{ name | location_name}}FinderReceiverItemLocationGameEntranceFound
{{ name | location_name}} + {% if hint.finding_player == player %} + {{ player_names_with_alias[(team, hint.finding_player)] }} + {% else %} + {{ player_names_with_alias[(team, hint.finding_player)] }} + {% endif %} + + {% if hint.receiving_player == player %} + {{ player_names_with_alias[(team, hint.receiving_player)] }} + {% else %} + {{ player_names_with_alias[(team, hint.receiving_player)] }} + {% endif %} + {{ item_id_to_name[games[(team, hint.receiving_player)]][hint.item] }}{{ location_id_to_name[games[(team, hint.finding_player)]][hint.location] }}{{ games[(team, hint.finding_player)] }}{% if hint.entrance %}{{ hint.entrance }}{% else %}Vanilla{% endif %}{% if hint.found %}✔{% endif %}
diff --git a/WebHostLib/templates/hintTable.html b/WebHostLib/templates/hintTable.html deleted file mode 100644 index 00b74111ea51..000000000000 --- a/WebHostLib/templates/hintTable.html +++ /dev/null @@ -1,28 +0,0 @@ -{% for team, hints in hints.items() %} -
- - - - - - - - - - - - - {%- for hint in hints -%} - - - - - - - - - {%- endfor -%} - -
FinderReceiverItemLocationEntranceFound
{{ long_player_names[team, hint.finding_player] }}{{ long_player_names[team, hint.receiving_player] }}{{ hint.item|item_name }}{{ hint.location|location_name }}{% if hint.entrance %}{{ hint.entrance }}{% else %}Vanilla{% endif %}{% if hint.found %}✔{% endif %}
-
-{% endfor %} \ No newline at end of file diff --git a/WebHostLib/templates/lttpMultiTracker.html b/WebHostLib/templates/lttpMultiTracker.html deleted file mode 100644 index 8eb471be390d..000000000000 --- a/WebHostLib/templates/lttpMultiTracker.html +++ /dev/null @@ -1,171 +0,0 @@ -{% extends 'tablepage.html' %} -{% block head %} - {{ super() }} - ALttP Multiworld Tracker - - - - -{% endblock %} - -{% block body %} - {% include 'header/dirtHeader.html' %} - {% include 'multiTrackerNavigation.html' %} -
-
- - - - Multistream - - - Clicking on a slot's number will bring up a slot-specific auto-tracker. This tracker will automatically update itself periodically. -
-
- {% for team, players in inventory.items() %} -
- - - - - - {%- for name in tracking_names -%} - {%- if name in icons -%} - - {%- else -%} - - {%- endif -%} - {%- endfor -%} - - - - {%- for player, items in players.items() -%} - - - {%- if (team, loop.index) in video -%} - {%- if video[(team, loop.index)][0] == "Twitch" -%} - - {%- elif video[(team, loop.index)][0] == "Youtube" -%} - - {%- endif -%} - {%- else -%} - - {%- endif -%} - {%- for id in tracking_ids -%} - {%- if items[id] -%} - - {%- else -%} - - {%- endif -%} - {% endfor %} - - {%- endfor -%} - -
#Name - {{ name|e }} - {{ name|e }}
{{ loop.index }} - - {{ player_names[(team, loop.index)] }} - ▶️ - - {{ player_names[(team, loop.index)] }} - ▶️{{ player_names[(team, loop.index)] }} - {% if id in multi_items %}{{ items[id] }}{% else %}✔️{% endif %}
-
- {% endfor %} - - {% for team, players in checks_done.items() %} -
- - - - - - {% for area in ordered_areas %} - {% set colspan = 1 %} - {% if area in key_locations %} - {% set colspan = colspan + 1 %} - {% endif %} - {% if area in big_key_locations %} - {% set colspan = colspan + 1 %} - {% endif %} - {% if area in icons %} - - {%- else -%} - - {%- endif -%} - {%- endfor -%} - - - - - {% for area in ordered_areas %} - - {% if area in key_locations %} - - {% endif %} - {% if area in big_key_locations %} - - {%- endif -%} - {%- endfor -%} - - - - {%- for player, checks in players.items() -%} - - - - {%- for area in ordered_areas -%} - {% if player in checks_in_area and area in checks_in_area[player] %} - {%- set checks_done = checks[area] -%} - {%- set checks_total = checks_in_area[player][area] -%} - {%- if checks_done == checks_total -%} - - {%- else -%} - - {%- endif -%} - {%- if area in key_locations -%} - - {%- endif -%} - {%- if area in big_key_locations -%} - - {%- endif -%} - {% else %} - - {%- if area in key_locations -%} - - {%- endif -%} - {%- if area in big_key_locations -%} - - {%- endif -%} - {% endif %} - {%- endfor -%} - - {%- if activity_timers[(team, player)] -%} - - {%- else -%} - - {%- endif -%} - - {%- endfor -%} - -
#Name - {{ area }}{{ area }}%Last
Activity
- Checks - - Small Key - - Big Key -
{{ loop.index }}{{ player_names[(team, loop.index)]|e }} - {{ checks_done }}/{{ checks_total }}{{ checks_done }}/{{ checks_total }}{{ inventory[team][player][small_key_ids[area]] }}{% if inventory[team][player][big_key_ids[area]] %}✔️{% endif %}{{ "{0:.2f}".format(percent_total_checks_done[team][player]) }}{{ activity_timers[(team, player)].total_seconds() }}None
-
- {% endfor %} - {% include "hintTable.html" with context %} -
-
-{% endblock %} diff --git a/WebHostLib/templates/multiTracker.html b/WebHostLib/templates/multiTracker.html deleted file mode 100644 index 1a3d353de11a..000000000000 --- a/WebHostLib/templates/multiTracker.html +++ /dev/null @@ -1,92 +0,0 @@ -{% extends 'tablepage.html' %} -{% block head %} - {{ super() }} - Multiworld Tracker - - -{% endblock %} - -{% block body %} - {% include 'header/dirtHeader.html' %} - {% include 'multiTrackerNavigation.html' %} -
-
- - - - Multistream - - - Clicking on a slot's number will bring up a slot-specific auto-tracker. This tracker will automatically update itself periodically. -
-
- {% for team, players in checks_done.items() %} -
- - - - - - - - {% block custom_table_headers %} - {# implement this block in game-specific multi trackers #} - {% endblock %} - - - - - - - {%- for player, checks in players.items() -%} - - - - - - {% block custom_table_row scoped %} - {# implement this block in game-specific multi trackers #} - {% endblock %} - - - {%- if activity_timers[team, player] -%} - - {%- else -%} - - {%- endif -%} - - {%- endfor -%} - - {% if not self.custom_table_headers() | trim %} - - - - - - - - - - - - {% endif %} -
#NameGameStatusChecks%Last
Activity
{{ loop.index }}{{ player_names[(team, loop.index)]|e }}{{ games[player] }}{{ {0: "Disconnected", 5: "Connected", 10: "Ready", 20: "Playing", - 30: "Goal Completed"}.get(states[team, player], "Unknown State") }} - {{ checks["Total"] }}/{{ locations[player] | length }} - {{ "{0:.2f}".format(percent_total_checks_done[team][player]) }}{{ activity_timers[team, player].total_seconds() }}None
TotalAll Games{{ completed_worlds }}/{{ players|length }} Complete{{ players.values()|sum(attribute='Total') }}/{{ total_locations[team] }} - {% if total_locations[team] == 0 %} - 100 - {% else %} - {{ "{0:.2f}".format(players.values()|sum(attribute='Total') / total_locations[team] * 100) }} - {% endif %} -
-
- {% endfor %} - {% include "hintTable.html" with context %} -
-
-{% endblock %} diff --git a/WebHostLib/templates/multiTrackerNavigation.html b/WebHostLib/templates/multiTrackerNavigation.html deleted file mode 100644 index 7fc405b6fbd2..000000000000 --- a/WebHostLib/templates/multiTrackerNavigation.html +++ /dev/null @@ -1,9 +0,0 @@ -{%- if enabled_multiworld_trackers|length > 1 -%} -
- {% for enabled_tracker in enabled_multiworld_trackers %} - {% set tracker_url = url_for(enabled_tracker.endpoint, tracker=room.tracker) %} - {{ enabled_tracker.name }} - {% endfor %} -
-{%- endif -%} diff --git a/WebHostLib/templates/multitracker.html b/WebHostLib/templates/multitracker.html new file mode 100644 index 000000000000..b16d4714ec6a --- /dev/null +++ b/WebHostLib/templates/multitracker.html @@ -0,0 +1,144 @@ +{% extends "tablepage.html" %} +{% block head %} + {{ super() }} + Multiworld Tracker + + +{% endblock %} + +{% block body %} + {% include "header/dirtHeader.html" %} + {% include "multitrackerNavigation.html" %} + +
+
+ + + + +
+ Clicking on a slot's number will bring up the slot-specific tracker. + This tracker will automatically update itself periodically. +
+
+ +
+ {%- for team, players in room_players.items() -%} +
+ + + + + + {% if current_tracker == "Generic" %}{% endif %} + + {% block custom_table_headers %} + {# Implement this block in game-specific multi-trackers. #} + {% endblock %} + + + + + + + {%- for player in players -%} + {%- if current_tracker == "Generic" or games[(team, player)] == current_tracker -%} + + + + {%- if current_tracker == "Generic" -%} + + {%- endif -%} + + + {% block custom_table_row scoped %} + {# Implement this block in game-specific multi-trackers. #} + {% endblock %} + + {% set location_count = locations[(team, player)] | length %} + + + + + {%- if activity_timers[(team, player)] -%} + + {%- else -%} + + {%- endif -%} + + {%- endif -%} + {%- endfor -%} + + + {%- if not self.custom_table_headers() | trim -%} + + + + + + + + + + + {%- endif -%} +
#NameGameStatusChecks%Last
Activity
+ + {{ player }} + + {{ player_names_with_alias[(team, player)] | e }}{{ games[(team, player)] }} + {{ + { + 0: "Disconnected", + 5: "Connected", + 10: "Ready", + 20: "Playing", + 30: "Goal Completed" + }.get(states[(team, player)], "Unknown State") + }} + + {{ locations_complete[(team, player)] }}/{{ location_count }} + + {%- if locations[(team, player)] | length > 0 -%} + {% set percentage_of_completion = locations_complete[(team, player)] / location_count * 100 %} + {{ "{0:.2f}".format(percentage_of_completion) }} + {%- else -%} + 100.00 + {%- endif -%} + {{ activity_timers[(team, player)].total_seconds() }}None
TotalAll Games{{ completed_worlds[team] }}/{{ players | length }} Complete + {{ total_team_locations_complete[team] }}/{{ total_team_locations[team] }} + + {%- if total_team_locations[team] == 0 -%} + 100 + {%- else -%} + {{ "{0:.2f}".format(total_team_locations_complete[team] / total_team_locations[team] * 100) }} + {%- endif -%} +
+
+ + {%- endfor -%} + + {% block custom_tables %} + {# Implement this block to create custom tables in game-specific multi-trackers. #} + {% endblock %} + + {% include "multitrackerHintTable.html" with context %} +
+
+{% endblock %} diff --git a/WebHostLib/templates/multitrackerHintTable.html b/WebHostLib/templates/multitrackerHintTable.html new file mode 100644 index 000000000000..a931e9b04845 --- /dev/null +++ b/WebHostLib/templates/multitrackerHintTable.html @@ -0,0 +1,37 @@ +{% for team, hints in hints.items() %} +
+ + + + + + + + + + + + + + {%- for hint in hints -%} + {%- + if current_tracker == "Generic" or ( + games[(team, hint.finding_player)] == current_tracker or + games[(team, hint.receiving_player)] == current_tracker + ) + -%} + + + + + + + + + + {% endif %} + {%- endfor -%} + +
FinderReceiverItemLocationGameEntranceFound
{{ player_names_with_alias[(team, hint.finding_player)] }}{{ player_names_with_alias[(team, hint.receiving_player)] }}{{ item_id_to_name[games[(team, hint.receiving_player)]][hint.item] }}{{ location_id_to_name[games[(team, hint.finding_player)]][hint.location] }}{{ games[(team, hint.finding_player)] }}{% if hint.entrance %}{{ hint.entrance }}{% else %}Vanilla{% endif %}{% if hint.found %}✔{% endif %}
+
+{% endfor %} diff --git a/WebHostLib/templates/multitrackerNavigation.html b/WebHostLib/templates/multitrackerNavigation.html new file mode 100644 index 000000000000..1256181b27d3 --- /dev/null +++ b/WebHostLib/templates/multitrackerNavigation.html @@ -0,0 +1,16 @@ +{% if enabled_trackers | length > 1 %} +
+ {# Multitracker game navigation. #} +
+ {%- for game_tracker in enabled_trackers -%} + {%- set tracker_url = url_for("get_multiworld_tracker", tracker=room.tracker, game=game_tracker) -%} + + {{ game_tracker }} + + {%- endfor -%} +
+
+{% endif %} diff --git a/WebHostLib/templates/multitracker__ALinkToThePast.html b/WebHostLib/templates/multitracker__ALinkToThePast.html new file mode 100644 index 000000000000..8cea5ba05785 --- /dev/null +++ b/WebHostLib/templates/multitracker__ALinkToThePast.html @@ -0,0 +1,205 @@ +{% extends "multitracker.html" %} +{% block head %} + {{ super() }} + + +{% endblock %} + +{# List all tracker-relevant icons. Format: (Name, Image URL) #} +{%- set icons = { + "Blue Shield": "https://www.zeldadungeon.net/wiki/images/8/85/Fighters-Shield.png", + "Red Shield": "https://www.zeldadungeon.net/wiki/images/5/55/Fire-Shield.png", + "Mirror Shield": "https://www.zeldadungeon.net/wiki/images/8/84/Mirror-Shield.png", + "Fighter Sword": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/4/40/SFighterSword.png?width=1920", + "Master Sword": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/6/65/SMasterSword.png?width=1920", + "Tempered Sword": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/9/92/STemperedSword.png?width=1920", + "Golden Sword": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/2/28/SGoldenSword.png?width=1920", + "Bow": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Bow_%26_Arrows_Sprite.png?version=5f85a70e6366bf473544ef93b274f74c", + "Silver Bow": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/6/65/Bow.png?width=1920", + "Green Mail": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/c/c9/SGreenTunic.png?width=1920", + "Blue Mail": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/9/98/SBlueTunic.png?width=1920", + "Red Mail": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/7/74/SRedTunic.png?width=1920", + "Power Glove": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/f/f5/SPowerGlove.png?width=1920", + "Titan Mitts": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/c/c1/STitanMitt.png?width=1920", + "Progressive Sword": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/cc/ALttP_Master_Sword_Sprite.png?version=55869db2a20e157cd3b5c8f556097725", + "Pegasus Boots": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ed/ALttP_Pegasus_Shoes_Sprite.png?version=405f42f97240c9dcd2b71ffc4bebc7f9", + "Progressive Glove": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/c/c1/STitanMitt.png?width=1920", + "Flippers": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/4/4c/ZoraFlippers.png?width=1920", + "Moon Pearl": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Moon_Pearl_Sprite.png?version=d601542d5abcc3e006ee163254bea77e", + "Progressive Bow": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Bow_%26_Arrows_Sprite.png?version=cfb7648b3714cccc80e2b17b2adf00ed", + "Blue Boomerang": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/c3/ALttP_Boomerang_Sprite.png?version=96127d163759395eb510b81a556d500e", + "Red Boomerang": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/b9/ALttP_Magical_Boomerang_Sprite.png?version=47cddce7a07bc3e4c2c10727b491f400", + "Hookshot": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/24/Hookshot.png?version=c90bc8e07a52e8090377bd6ef854c18b", + "Mushroom": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/35/ALttP_Mushroom_Sprite.png?version=1f1acb30d71bd96b60a3491e54bbfe59", + "Magic Powder": "https://www.zeldadungeon.net/wiki/images/thumb/6/62/MagicPowder-ALttP-Sprite.png/86px-MagicPowder-ALttP-Sprite.png", + "Fire Rod": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d6/FireRod.png?version=6eabc9f24d25697e2c4cd43ddc8207c0", + "Ice Rod": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d7/ALttP_Ice_Rod_Sprite.png?version=1f944148223d91cfc6a615c92286c3bc", + "Bombos": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/8c/ALttP_Bombos_Medallion_Sprite.png?version=f4d6aba47fb69375e090178f0fc33b26", + "Ether": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/3c/Ether.png?version=34027651a5565fcc5a83189178ab17b5", + "Quake": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/56/ALttP_Quake_Medallion_Sprite.png?version=efd64d451b1831bd59f7b7d6b61b5879", + "Lamp": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Lantern_Sprite.png?version=e76eaa1ec509c9a5efb2916698d5a4ce", + "Hammer": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d1/ALttP_Hammer_Sprite.png?version=e0adec227193818dcaedf587eba34500", + "Shovel": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/c4/ALttP_Shovel_Sprite.png?version=e73d1ce0115c2c70eaca15b014bd6f05", + "Flute": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/db/Flute.png?version=ec4982b31c56da2c0c010905c5c60390", + "Bug Catching Net": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/54/Bug-CatchingNet.png?version=4d40e0ee015b687ff75b333b968d8be6", + "Book of Mudora": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/22/ALttP_Book_of_Mudora_Sprite.png?version=11e4632bba54f6b9bf921df06ac93744", + "Bottle": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ef/ALttP_Magic_Bottle_Sprite.png?version=fd98ab04db775270cbe79fce0235777b", + "Cane of Somaria": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e1/ALttP_Cane_of_Somaria_Sprite.png?version=8cc1900dfd887890badffc903bb87943", + "Cane of Byrna": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Cane_of_Byrna_Sprite.png?version=758b607c8cbe2cf1900d42a0b3d0fb54", + "Cape": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/1/1c/ALttP_Magic_Cape_Sprite.png?version=6b77f0d609aab0c751307fc124736832", + "Magic Mirror": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e5/ALttP_Magic_Mirror_Sprite.png?version=e035dbc9cbe2a3bd44aa6d047762b0cc", + "Triforce": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/4/4e/TriforceALttPTitle.png?version=dc398e1293177581c16303e4f9d12a48", + "Triforce Piece": "https://www.zeldadungeon.net/wiki/images/thumb/5/54/Triforce_Fragment_-_BS_Zelda.png/62px-Triforce_Fragment_-_BS_Zelda.png", + "Small Key": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/f/f1/ALttP_Small_Key_Sprite.png?version=4f35d92842f0de39d969181eea03774e", + "Big Key": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/33/ALttP_Big_Key_Sprite.png?version=136dfa418ba76c8b4e270f466fc12f4d", + "Chest": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/7/73/ALttP_Treasure_Chest_Sprite.png?version=5f530ecd98dcb22251e146e8049c0dda", + "Light World": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e7/ALttP_Soldier_Green_Sprite.png?version=d650d417934cd707a47e496489c268a6", + "Dark World": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/9/94/ALttP_Moblin_Sprite.png?version=ebf50e33f4657c377d1606bcc0886ddc", + "Hyrule Castle": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d3/ALttP_Ball_and_Chain_Trooper_Sprite.png?version=1768a87c06d29cc8e7ddd80b9fa516be", + "Agahnims Tower": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/1/1e/ALttP_Agahnim_Sprite.png?version=365956e61b0c2191eae4eddbe591dab5", + "Desert Palace": "https://www.zeldadungeon.net/wiki/images/2/25/Lanmola-ALTTP-Sprite.png", + "Eastern Palace": "https://www.zeldadungeon.net/wiki/images/d/dc/RedArmosKnight.png", + "Tower of Hera": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/3c/ALttP_Moldorm_Sprite.png?version=c588257bdc2543468e008a6b30f262a7", + "Palace of Darkness": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ed/ALttP_Helmasaur_King_Sprite.png?version=ab8a4a1cfd91d4fc43466c56cba30022", + "Swamp Palace": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/7/73/ALttP_Arrghus_Sprite.png?version=b098be3122e53f751b74f4a5ef9184b5", + "Skull Woods": "https://alttp-wiki.net/images/6/6a/Mothula.png", + "Thieves Town": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/86/ALttP_Blind_the_Thief_Sprite.png?version=3833021bfcd112be54e7390679047222", + "Ice Palace": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/33/ALttP_Kholdstare_Sprite.png?version=e5a1b0e8b2298e550d85f90bf97045c0", + "Misery Mire": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/85/ALttP_Vitreous_Sprite.png?version=92b2e9cb0aa63f831760f08041d8d8d8", + "Turtle Rock": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/9/91/ALttP_Trinexx_Sprite.png?version=0cc867d513952aa03edd155597a0c0be", + "Ganons Tower": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/b9/ALttP_Ganon_Sprite.png?version=956f51f054954dfff53c1a9d4f929c74", +} -%} + +{%- block custom_table_headers %} +{#- macro that creates a table header with display name and image -#} +{%- macro make_header(name, img_src) %} + + {{ name }} + +{% endmacro -%} + +{#- call the macro to build the table header -#} +{%- for name in tracking_names %} + {%- if name in icons -%} + + {{ name | e }} + + {%- endif %} +{% endfor -%} +{% endblock %} + +{# build each row of custom entries #} +{% block custom_table_row scoped %} + {%- for id in tracking_ids -%} +{# {{ checks }}#} + {%- if inventories[(team, player)][id] -%} + + {% if id in multi_items %}{{ inventories[(team, player)][id] }}{% else %}✔️{% endif %} + + {%- else -%} + + {%- endif -%} + {% endfor %} +{% endblock %} + +{% block custom_tables %} + +{% for team, _ in total_team_locations.items() %} +
+ + + + + + {% for area in ordered_areas %} + {% set colspan = 1 %} + {% if area in key_locations %} + {% set colspan = colspan + 1 %} + {% endif %} + {% if area in big_key_locations %} + {% set colspan = colspan + 1 %} + {% endif %} + {% if area in icons %} + + {%- else -%} + + {%- endif -%} + {%- endfor -%} + + + + + {% for area in ordered_areas %} + + {% if area in key_locations %} + + {% endif %} + {% if area in big_key_locations %} + + {%- endif -%} + {%- endfor -%} + + + + {%- for (checks_team, player), area_checks in checks_done.items() if games[(team, player)] == current_tracker and team == checks_team -%} + + + + {%- for area in ordered_areas -%} + {% if (team, player) in checks_in_area and area in checks_in_area[(team, player)] %} + {%- set checks_done = area_checks[area] -%} + {%- set checks_total = checks_in_area[(team, player)][area] -%} + {%- if checks_done == checks_total -%} + + {%- else -%} + + {%- endif -%} + {%- if area in key_locations -%} + + {%- endif -%} + {%- if area in big_key_locations -%} + + {%- endif -%} + {% else %} + + {%- if area in key_locations -%} + + {%- endif -%} + {%- if area in big_key_locations -%} + + {%- endif -%} + {% endif %} + {%- endfor -%} + + + + {%- if activity_timers[(team, player)] -%} + + {%- else -%} + + {%- endif -%} + + {%- endfor -%} + +
#Name + {{ area }}{{ area }}%Last
Activity
+ Checks + + Small Key + + Big Key +
{{ player }}{{ player_names_with_alias[(team, player)] | e }} + {{ checks_done }}/{{ checks_total }}{{ checks_done }}/{{ checks_total }}{{ inventories[(team, player)][small_key_ids[area]] }}{% if inventories[(team, player)][big_key_ids[area]] %}✔️{% endif %} + {% set location_count = locations[(team, player)] | length %} + {%- if locations[(team, player)] | length > 0 -%} + {% set percentage_of_completion = locations_complete[(team, player)] / location_count * 100 %} + {{ "{0:.2f}".format(percentage_of_completion) }} + {%- else -%} + 100.00 + {%- endif -%} + {{ activity_timers[(team, player)].total_seconds() }}None
+
+{% endfor %} + +{% endblock %} diff --git a/WebHostLib/templates/multiFactorioTracker.html b/WebHostLib/templates/multitracker__Factorio.html similarity index 79% rename from WebHostLib/templates/multiFactorioTracker.html rename to WebHostLib/templates/multitracker__Factorio.html index 389a79d411b5..a7ad824db41f 100644 --- a/WebHostLib/templates/multiFactorioTracker.html +++ b/WebHostLib/templates/multitracker__Factorio.html @@ -1,4 +1,4 @@ -{% extends "multiTracker.html" %} +{% extends "multitracker.html" %} {# establish the to be tracked data. Display Name, factorio/AP internal name, display image #} {%- set science_packs = [ ("Logistic Science Pack", "logistic-science-pack", @@ -14,12 +14,12 @@ ("Space Science Pack", "space-science-pack", "https://wiki.factorio.com/images/thumb/Space_science_pack.png/32px-Space_science_pack.png"), ] -%} + {%- block custom_table_headers %} {#- macro that creates a table header with display name and image -#} {%- macro make_header(name, img_src) %} - {{ name }} + {{ name }} {% endmacro -%} {#- call the macro to build the table header -#} @@ -27,16 +27,15 @@ {{ make_header(name, img_src) }} {% endfor -%} {% endblock %} + {% block custom_table_row scoped %} -{% if games[player] == "Factorio" %} - {%- set player_inventory = named_inventory[team][player] -%} + {%- set player_inventory = inventories[(team, player)] -%} {%- set prog_science = player_inventory["progressive-science-pack"] -%} {%- for name, internal_name, img_src in science_packs %} - {% if player_inventory[internal_name] or prog_science > loop.index0 %}✔{% endif %} + {% if player_inventory[internal_name] or prog_science > loop.index0 %} + ✔️ + {% else %} + + {% endif %} {% endfor -%} -{% else %} - {%- for _ in science_packs %} - ❌ - {% endfor -%} -{% endif %} {% endblock%} diff --git a/WebHostLib/templates/player-options.html b/WebHostLib/templates/player-options.html index 701b4e5861c0..4c749752882a 100644 --- a/WebHostLib/templates/player-options.html +++ b/WebHostLib/templates/player-options.html @@ -28,10 +28,24 @@

Player Options

template file for this game.

-


- -

+
+
+ + +
+
+ + +
+ +

Game Options

diff --git a/WebHostLib/templates/tracker__ALinkToThePast.html b/WebHostLib/templates/tracker__ALinkToThePast.html new file mode 100644 index 000000000000..b7bae26fd35b --- /dev/null +++ b/WebHostLib/templates/tracker__ALinkToThePast.html @@ -0,0 +1,154 @@ +{%- set icons = { + "Blue Shield": "https://www.zeldadungeon.net/wiki/images/8/85/Fighters-Shield.png", + "Red Shield": "https://www.zeldadungeon.net/wiki/images/5/55/Fire-Shield.png", + "Mirror Shield": "https://www.zeldadungeon.net/wiki/images/8/84/Mirror-Shield.png", + "Fighter Sword": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/4/40/SFighterSword.png?width=1920", + "Master Sword": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/6/65/SMasterSword.png?width=1920", + "Tempered Sword": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/9/92/STemperedSword.png?width=1920", + "Golden Sword": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/2/28/SGoldenSword.png?width=1920", + "Bow": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Bow_%26_Arrows_Sprite.png?version=5f85a70e6366bf473544ef93b274f74c", + "Silver Bow": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/6/65/Bow.png?width=1920", + "Green Mail": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/c/c9/SGreenTunic.png?width=1920", + "Blue Mail": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/9/98/SBlueTunic.png?width=1920", + "Red Mail": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/7/74/SRedTunic.png?width=1920", + "Power Glove": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/f/f5/SPowerGlove.png?width=1920", + "Titan Mitts": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/c/c1/STitanMitt.png?width=1920", + "Progressive Sword": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/cc/ALttP_Master_Sword_Sprite.png?version=55869db2a20e157cd3b5c8f556097725", + "Pegasus Boots": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ed/ALttP_Pegasus_Shoes_Sprite.png?version=405f42f97240c9dcd2b71ffc4bebc7f9", + "Progressive Glove": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/c/c1/STitanMitt.png?width=1920", + "Flippers": "https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/4/4c/ZoraFlippers.png?width=1920", + "Moon Pearl": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Moon_Pearl_Sprite.png?version=d601542d5abcc3e006ee163254bea77e", + "Progressive Bow": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Bow_%26_Arrows_Sprite.png?version=cfb7648b3714cccc80e2b17b2adf00ed", + "Blue Boomerang": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/c3/ALttP_Boomerang_Sprite.png?version=96127d163759395eb510b81a556d500e", + "Red Boomerang": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/b9/ALttP_Magical_Boomerang_Sprite.png?version=47cddce7a07bc3e4c2c10727b491f400", + "Hookshot": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/24/Hookshot.png?version=c90bc8e07a52e8090377bd6ef854c18b", + "Mushroom": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/35/ALttP_Mushroom_Sprite.png?version=1f1acb30d71bd96b60a3491e54bbfe59", + "Magic Powder": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e5/ALttP_Magic_Powder_Sprite.png?version=c24e38effbd4f80496d35830ce8ff4ec", + "Fire Rod": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d6/FireRod.png?version=6eabc9f24d25697e2c4cd43ddc8207c0", + "Ice Rod": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d7/ALttP_Ice_Rod_Sprite.png?version=1f944148223d91cfc6a615c92286c3bc", + "Bombos": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/8c/ALttP_Bombos_Medallion_Sprite.png?version=f4d6aba47fb69375e090178f0fc33b26", + "Ether": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/3c/Ether.png?version=34027651a5565fcc5a83189178ab17b5", + "Quake": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/56/ALttP_Quake_Medallion_Sprite.png?version=efd64d451b1831bd59f7b7d6b61b5879", + "Lamp": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Lantern_Sprite.png?version=e76eaa1ec509c9a5efb2916698d5a4ce", + "Hammer": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d1/ALttP_Hammer_Sprite.png?version=e0adec227193818dcaedf587eba34500", + "Shovel": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/c4/ALttP_Shovel_Sprite.png?version=e73d1ce0115c2c70eaca15b014bd6f05", + "Flute": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/db/Flute.png?version=ec4982b31c56da2c0c010905c5c60390", + "Bug Catching Net": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/54/Bug-CatchingNet.png?version=4d40e0ee015b687ff75b333b968d8be6", + "Book of Mudora": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/22/ALttP_Book_of_Mudora_Sprite.png?version=11e4632bba54f6b9bf921df06ac93744", + "Bottle": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ef/ALttP_Magic_Bottle_Sprite.png?version=fd98ab04db775270cbe79fce0235777b", + "Cane of Somaria": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e1/ALttP_Cane_of_Somaria_Sprite.png?version=8cc1900dfd887890badffc903bb87943", + "Cane of Byrna": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Cane_of_Byrna_Sprite.png?version=758b607c8cbe2cf1900d42a0b3d0fb54", + "Cape": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/1/1c/ALttP_Magic_Cape_Sprite.png?version=6b77f0d609aab0c751307fc124736832", + "Magic Mirror": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e5/ALttP_Magic_Mirror_Sprite.png?version=e035dbc9cbe2a3bd44aa6d047762b0cc", + "Triforce": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/4/4e/TriforceALttPTitle.png?version=dc398e1293177581c16303e4f9d12a48", + "Triforce Piece": "https://www.zeldadungeon.net/wiki/images/thumb/5/54/Triforce_Fragment_-_BS_Zelda.png/62px-Triforce_Fragment_-_BS_Zelda.png", + "Small Key": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/f/f1/ALttP_Small_Key_Sprite.png?version=4f35d92842f0de39d969181eea03774e", + "Big Key": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/33/ALttP_Big_Key_Sprite.png?version=136dfa418ba76c8b4e270f466fc12f4d", + "Chest": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/7/73/ALttP_Treasure_Chest_Sprite.png?version=5f530ecd98dcb22251e146e8049c0dda", + "Light World": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e7/ALttP_Soldier_Green_Sprite.png?version=d650d417934cd707a47e496489c268a6", + "Dark World": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/9/94/ALttP_Moblin_Sprite.png?version=ebf50e33f4657c377d1606bcc0886ddc", + "Hyrule Castle": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d3/ALttP_Ball_and_Chain_Trooper_Sprite.png?version=1768a87c06d29cc8e7ddd80b9fa516be", + "Agahnims Tower": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/1/1e/ALttP_Agahnim_Sprite.png?version=365956e61b0c2191eae4eddbe591dab5", + "Desert Palace": "https://www.zeldadungeon.net/wiki/images/2/25/Lanmola-ALTTP-Sprite.png", + "Eastern Palace": "https://www.zeldadungeon.net/wiki/images/d/dc/RedArmosKnight.png", + "Tower of Hera": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/3c/ALttP_Moldorm_Sprite.png?version=c588257bdc2543468e008a6b30f262a7", + "Palace of Darkness": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ed/ALttP_Helmasaur_King_Sprite.png?version=ab8a4a1cfd91d4fc43466c56cba30022", + "Swamp Palace": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/7/73/ALttP_Arrghus_Sprite.png?version=b098be3122e53f751b74f4a5ef9184b5", + "Skull Woods": "https://alttp-wiki.net/images/6/6a/Mothula.png", + "Thieves Town": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/86/ALttP_Blind_the_Thief_Sprite.png?version=3833021bfcd112be54e7390679047222", + "Ice Palace": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/33/ALttP_Kholdstare_Sprite.png?version=e5a1b0e8b2298e550d85f90bf97045c0", + "Misery Mire": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/85/ALttP_Vitreous_Sprite.png?version=92b2e9cb0aa63f831760f08041d8d8d8", + "Turtle Rock": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/9/91/ALttP_Trinexx_Sprite.png?version=0cc867d513952aa03edd155597a0c0be", + "Ganons Tower": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/b9/ALttP_Ganon_Sprite.png?version=956f51f054954dfff53c1a9d4f929c74", +} -%} + + + + + {{ player_name }}'s Tracker + + + + + + {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #} +
+ Switch To Generic Tracker +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + {% if key_locations and "Universal" not in key_locations %} + + {% endif %} + {% if big_key_locations %} + + {% endif %} + + {% for area in sp_areas %} + + + + {% if key_locations and "Universal" not in key_locations %} + + {% endif %} + {% if big_key_locations %} + + {% endif %} + + {% endfor %} +
{{ area }}{{ checks_done[area] }} / {{ checks_in_area[area] }} + {{ inventory[small_key_ids[area]] if area in key_locations else '—' }} + + {{ '✔' if area in big_key_locations and inventory[big_key_ids[area]] else ('—' if area not in big_key_locations else '') }} +
+
+ + diff --git a/WebHostLib/templates/checksfinderTracker.html b/WebHostLib/templates/tracker__ChecksFinder.html similarity index 82% rename from WebHostLib/templates/checksfinderTracker.html rename to WebHostLib/templates/tracker__ChecksFinder.html index 5df77f5e74d0..f0995c854838 100644 --- a/WebHostLib/templates/checksfinderTracker.html +++ b/WebHostLib/templates/tracker__ChecksFinder.html @@ -7,6 +7,11 @@ + {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #} +
+ Switch To Generic Tracker +
+
diff --git a/WebHostLib/templates/minecraftTracker.html b/WebHostLib/templates/tracker__Minecraft.html similarity index 94% rename from WebHostLib/templates/minecraftTracker.html rename to WebHostLib/templates/tracker__Minecraft.html index 9f5022b4cc43..248f2778bda1 100644 --- a/WebHostLib/templates/minecraftTracker.html +++ b/WebHostLib/templates/tracker__Minecraft.html @@ -8,13 +8,18 @@ + {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #} + +
-
diff --git a/WebHostLib/templates/tracker__OcarinaOfTime.html b/WebHostLib/templates/tracker__OcarinaOfTime.html new file mode 100644 index 000000000000..41b76816cfca --- /dev/null +++ b/WebHostLib/templates/tracker__OcarinaOfTime.html @@ -0,0 +1,185 @@ + + + + {{ player_name }}'s Tracker + + + + + + {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #} + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
{{ hookshot_length }}
+
+
+
+ +
{{ bottle_count if bottle_count > 0 else '' }}
+
+
+
+ +
{{ wallet_size }}
+
+
+
+ +
Zelda
+
+
+
+ +
Epona
+
+
+
+ +
Saria
+
+
+
+ +
Sun
+
+
+
+ +
Time
+
+
+
+ +
Storms
+
+
+
+ +
{{ token_count }}
+
+
+
+ +
Min
+
+
+
+ +
Bol
+
+
+
+ +
Ser
+
+
+
+ +
Req
+
+
+
+ +
Noc
+
+
+
+ +
Pre
+
+
+
+ +
{{ piece_count if piece_count > 0 else '' }}
+
+
+ + + + + + + + {% for area in checks_done %} + + + + + + + + {% for location in location_info[area] %} + + + + + + + {% endfor %} + + {% endfor %} +
Items
{{ area }} {{'▼' if area != 'Total'}}{{ small_key_counts.get(area, '-') }}{{ boss_key_counts.get(area, '-') }}{{ checks_done[area] }} / {{ checks_in_area[area] }}
{{ location }}{{ '✔' if location_info[area][location] else '' }}
+
+ + diff --git a/WebHostLib/templates/sc2wolTracker.html b/WebHostLib/templates/tracker__Starcraft2WingsOfLiberty.html similarity index 99% rename from WebHostLib/templates/sc2wolTracker.html rename to WebHostLib/templates/tracker__Starcraft2WingsOfLiberty.html index 49c31a579544..c27f690dfd36 100644 --- a/WebHostLib/templates/sc2wolTracker.html +++ b/WebHostLib/templates/tracker__Starcraft2WingsOfLiberty.html @@ -8,6 +8,11 @@ + {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #} + +
diff --git a/WebHostLib/templates/supermetroidTracker.html b/WebHostLib/templates/tracker__SuperMetroid.html similarity index 94% rename from WebHostLib/templates/supermetroidTracker.html rename to WebHostLib/templates/tracker__SuperMetroid.html index 342f75642fcc..0c648176513f 100644 --- a/WebHostLib/templates/supermetroidTracker.html +++ b/WebHostLib/templates/tracker__SuperMetroid.html @@ -7,6 +7,11 @@ + {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #} + +
diff --git a/WebHostLib/templates/timespinnerTracker.html b/WebHostLib/templates/tracker__Timespinner.html similarity index 95% rename from WebHostLib/templates/timespinnerTracker.html rename to WebHostLib/templates/tracker__Timespinner.html index f02ec6daab77..b118c3383344 100644 --- a/WebHostLib/templates/timespinnerTracker.html +++ b/WebHostLib/templates/tracker__Timespinner.html @@ -7,6 +7,11 @@ + {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #} + +
@@ -51,16 +56,16 @@
{% if 'DownloadableItems' in options %}
- {% endif %} + {% endif %}
{% if 'DownloadableItems' in options %}
- {% endif %} + {% endif %}
{% if 'EyeSpy' in options %}
- {% endif %} + {% endif %}
diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py index 5fb1a42c845c..a1e42f93f80f 100644 --- a/WebHostLib/tracker.py +++ b/WebHostLib/tracker.py @@ -1,1773 +1,1960 @@ -import collections import datetime -import typing -from typing import Counter, Optional, Dict, Any, Tuple, List +from dataclasses import dataclass +from typing import Any, Callable, Dict, List, Optional, Set, Tuple from uuid import UUID from flask import render_template -from jinja2 import pass_context, runtime from werkzeug.exceptions import abort from MultiServer import Context, get_saving_second -from NetUtils import ClientStatus, SlotType, NetworkSlot +from NetUtils import ClientStatus, Hint, NetworkItem, NetworkSlot, SlotType from Utils import restricted_loads -from worlds import lookup_any_item_id_to_name, lookup_any_location_id_to_name, network_data_package, games -from worlds.alttp import Items from . import app, cache from .models import GameDataPackage, Room -alttp_icons = { - "Blue Shield": r"https://www.zeldadungeon.net/wiki/images/8/85/Fighters-Shield.png", - "Red Shield": r"https://www.zeldadungeon.net/wiki/images/5/55/Fire-Shield.png", - "Mirror Shield": r"https://www.zeldadungeon.net/wiki/images/8/84/Mirror-Shield.png", - "Fighter Sword": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/4/40/SFighterSword.png?width=1920", - "Master Sword": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/6/65/SMasterSword.png?width=1920", - "Tempered Sword": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/9/92/STemperedSword.png?width=1920", - "Golden Sword": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/2/28/SGoldenSword.png?width=1920", - "Bow": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Bow_%26_Arrows_Sprite.png?version=5f85a70e6366bf473544ef93b274f74c", - "Silver Bow": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/6/65/Bow.png?width=1920", - "Green Mail": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/c/c9/SGreenTunic.png?width=1920", - "Blue Mail": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/9/98/SBlueTunic.png?width=1920", - "Red Mail": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/7/74/SRedTunic.png?width=1920", - "Power Glove": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/f/f5/SPowerGlove.png?width=1920", - "Titan Mitts": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/c/c1/STitanMitt.png?width=1920", - "Progressive Sword": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/cc/ALttP_Master_Sword_Sprite.png?version=55869db2a20e157cd3b5c8f556097725", - "Pegasus Boots": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ed/ALttP_Pegasus_Shoes_Sprite.png?version=405f42f97240c9dcd2b71ffc4bebc7f9", - "Progressive Glove": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/c/c1/STitanMitt.png?width=1920", - "Flippers": r"https://oyster.ignimgs.com/mediawiki/apis.ign.com/the-legend-of-zelda-a-link-to-the-past/4/4c/ZoraFlippers.png?width=1920", - "Moon Pearl": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Moon_Pearl_Sprite.png?version=d601542d5abcc3e006ee163254bea77e", - "Progressive Bow": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Bow_%26_Arrows_Sprite.png?version=cfb7648b3714cccc80e2b17b2adf00ed", - "Blue Boomerang": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/c3/ALttP_Boomerang_Sprite.png?version=96127d163759395eb510b81a556d500e", - "Red Boomerang": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/b9/ALttP_Magical_Boomerang_Sprite.png?version=47cddce7a07bc3e4c2c10727b491f400", - "Hookshot": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/24/Hookshot.png?version=c90bc8e07a52e8090377bd6ef854c18b", - "Mushroom": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/35/ALttP_Mushroom_Sprite.png?version=1f1acb30d71bd96b60a3491e54bbfe59", - "Magic Powder": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e5/ALttP_Magic_Powder_Sprite.png?version=c24e38effbd4f80496d35830ce8ff4ec", - "Fire Rod": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d6/FireRod.png?version=6eabc9f24d25697e2c4cd43ddc8207c0", - "Ice Rod": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d7/ALttP_Ice_Rod_Sprite.png?version=1f944148223d91cfc6a615c92286c3bc", - "Bombos": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/8c/ALttP_Bombos_Medallion_Sprite.png?version=f4d6aba47fb69375e090178f0fc33b26", - "Ether": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/3c/Ether.png?version=34027651a5565fcc5a83189178ab17b5", - "Quake": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/56/ALttP_Quake_Medallion_Sprite.png?version=efd64d451b1831bd59f7b7d6b61b5879", - "Lamp": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Lantern_Sprite.png?version=e76eaa1ec509c9a5efb2916698d5a4ce", - "Hammer": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d1/ALttP_Hammer_Sprite.png?version=e0adec227193818dcaedf587eba34500", - "Shovel": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/c4/ALttP_Shovel_Sprite.png?version=e73d1ce0115c2c70eaca15b014bd6f05", - "Flute": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/db/Flute.png?version=ec4982b31c56da2c0c010905c5c60390", - "Bug Catching Net": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/54/Bug-CatchingNet.png?version=4d40e0ee015b687ff75b333b968d8be6", - "Book of Mudora": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/22/ALttP_Book_of_Mudora_Sprite.png?version=11e4632bba54f6b9bf921df06ac93744", - "Bottle": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ef/ALttP_Magic_Bottle_Sprite.png?version=fd98ab04db775270cbe79fce0235777b", - "Cane of Somaria": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e1/ALttP_Cane_of_Somaria_Sprite.png?version=8cc1900dfd887890badffc903bb87943", - "Cane of Byrna": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Cane_of_Byrna_Sprite.png?version=758b607c8cbe2cf1900d42a0b3d0fb54", - "Cape": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/1/1c/ALttP_Magic_Cape_Sprite.png?version=6b77f0d609aab0c751307fc124736832", - "Magic Mirror": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e5/ALttP_Magic_Mirror_Sprite.png?version=e035dbc9cbe2a3bd44aa6d047762b0cc", - "Triforce": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/4/4e/TriforceALttPTitle.png?version=dc398e1293177581c16303e4f9d12a48", - "Small Key": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/f/f1/ALttP_Small_Key_Sprite.png?version=4f35d92842f0de39d969181eea03774e", - "Big Key": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/33/ALttP_Big_Key_Sprite.png?version=136dfa418ba76c8b4e270f466fc12f4d", - "Chest": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/7/73/ALttP_Treasure_Chest_Sprite.png?version=5f530ecd98dcb22251e146e8049c0dda", - "Light World": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e7/ALttP_Soldier_Green_Sprite.png?version=d650d417934cd707a47e496489c268a6", - "Dark World": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/9/94/ALttP_Moblin_Sprite.png?version=ebf50e33f4657c377d1606bcc0886ddc", - "Hyrule Castle": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d3/ALttP_Ball_and_Chain_Trooper_Sprite.png?version=1768a87c06d29cc8e7ddd80b9fa516be", - "Agahnims Tower": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/1/1e/ALttP_Agahnim_Sprite.png?version=365956e61b0c2191eae4eddbe591dab5", - "Desert Palace": r"https://www.zeldadungeon.net/wiki/images/2/25/Lanmola-ALTTP-Sprite.png", - "Eastern Palace": r"https://www.zeldadungeon.net/wiki/images/d/dc/RedArmosKnight.png", - "Tower of Hera": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/3c/ALttP_Moldorm_Sprite.png?version=c588257bdc2543468e008a6b30f262a7", - "Palace of Darkness": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ed/ALttP_Helmasaur_King_Sprite.png?version=ab8a4a1cfd91d4fc43466c56cba30022", - "Swamp Palace": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/7/73/ALttP_Arrghus_Sprite.png?version=b098be3122e53f751b74f4a5ef9184b5", - "Skull Woods": r"https://alttp-wiki.net/images/6/6a/Mothula.png", - "Thieves Town": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/86/ALttP_Blind_the_Thief_Sprite.png?version=3833021bfcd112be54e7390679047222", - "Ice Palace": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/33/ALttP_Kholdstare_Sprite.png?version=e5a1b0e8b2298e550d85f90bf97045c0", - "Misery Mire": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/85/ALttP_Vitreous_Sprite.png?version=92b2e9cb0aa63f831760f08041d8d8d8", - "Turtle Rock": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/9/91/ALttP_Trinexx_Sprite.png?version=0cc867d513952aa03edd155597a0c0be", - "Ganons Tower": r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/b9/ALttP_Ganon_Sprite.png?version=956f51f054954dfff53c1a9d4f929c74" -} - - -def get_alttp_id(item_name): - return Items.item_table[item_name][2] - - -links = {"Bow": "Progressive Bow", - "Silver Arrows": "Progressive Bow", - "Silver Bow": "Progressive Bow", - "Progressive Bow (Alt)": "Progressive Bow", - "Bottle (Red Potion)": "Bottle", - "Bottle (Green Potion)": "Bottle", - "Bottle (Blue Potion)": "Bottle", - "Bottle (Fairy)": "Bottle", - "Bottle (Bee)": "Bottle", - "Bottle (Good Bee)": "Bottle", - "Fighter Sword": "Progressive Sword", - "Master Sword": "Progressive Sword", - "Tempered Sword": "Progressive Sword", - "Golden Sword": "Progressive Sword", - "Power Glove": "Progressive Glove", - "Titans Mitts": "Progressive Glove" - } - -levels = {"Fighter Sword": 1, - "Master Sword": 2, - "Tempered Sword": 3, - "Golden Sword": 4, - "Power Glove": 1, - "Titans Mitts": 2, - "Bow": 1, - "Silver Bow": 2} - -multi_items = {get_alttp_id(name) for name in ("Progressive Sword", "Progressive Bow", "Bottle", "Progressive Glove")} -links = {get_alttp_id(key): get_alttp_id(value) for key, value in links.items()} -levels = {get_alttp_id(key): value for key, value in levels.items()} - -tracking_names = ["Progressive Sword", "Progressive Bow", "Book of Mudora", "Hammer", - "Hookshot", "Magic Mirror", "Flute", - "Pegasus Boots", "Progressive Glove", "Flippers", "Moon Pearl", "Blue Boomerang", - "Red Boomerang", "Bug Catching Net", "Cape", "Shovel", "Lamp", - "Mushroom", "Magic Powder", - "Cane of Somaria", "Cane of Byrna", "Fire Rod", "Ice Rod", "Bombos", "Ether", "Quake", - "Bottle", "Triforce"] - -default_locations = { - 'Light World': {1572864, 1572865, 60034, 1572867, 1572868, 60037, 1572869, 1572866, 60040, 59788, 60046, 60175, - 1572880, 60049, 60178, 1572883, 60052, 60181, 1572885, 60055, 60184, 191256, 60058, 60187, 1572884, - 1572886, 1572887, 1572906, 60202, 60205, 59824, 166320, 1010170, 60208, 60211, 60214, 60217, 59836, - 60220, 60223, 59839, 1573184, 60226, 975299, 1573188, 1573189, 188229, 60229, 60232, 1573193, - 1573194, 60235, 1573187, 59845, 59854, 211407, 60238, 59857, 1573185, 1573186, 1572882, 212328, - 59881, 59761, 59890, 59770, 193020, 212605}, - 'Dark World': {59776, 59779, 975237, 1572870, 60043, 1572881, 60190, 60193, 60196, 60199, 60840, 1573190, 209095, - 1573192, 1573191, 60241, 60244, 60247, 60250, 59884, 59887, 60019, 60022, 60028, 60031}, - 'Desert Palace': {1573216, 59842, 59851, 59791, 1573201, 59830}, - 'Eastern Palace': {1573200, 59827, 59893, 59767, 59833, 59773}, - 'Hyrule Castle': {60256, 60259, 60169, 60172, 59758, 59764, 60025, 60253}, - 'Agahnims Tower': {60082, 60085}, - 'Tower of Hera': {1573218, 59878, 59821, 1573202, 59896, 59899}, - 'Swamp Palace': {60064, 60067, 60070, 59782, 59785, 60073, 60076, 60079, 1573204, 60061}, - 'Thieves Town': {59905, 59908, 59911, 59914, 59917, 59920, 59923, 1573206}, - 'Skull Woods': {59809, 59902, 59848, 59794, 1573205, 59800, 59803, 59806}, - 'Ice Palace': {59872, 59875, 59812, 59818, 59860, 59797, 1573207, 59869}, - 'Misery Mire': {60001, 60004, 60007, 60010, 60013, 1573208, 59866, 59998}, - 'Turtle Rock': {59938, 59941, 59944, 1573209, 59947, 59950, 59953, 59956, 59926, 59929, 59932, 59935}, - 'Palace of Darkness': {59968, 59971, 59974, 59977, 59980, 59983, 59986, 1573203, 59989, 59959, 59992, 59962, 59995, - 59965}, - 'Ganons Tower': {60160, 60163, 60166, 60088, 60091, 60094, 60097, 60100, 60103, 60106, 60109, 60112, 60115, 60118, - 60121, 60124, 60127, 1573217, 60130, 60133, 60136, 60139, 60142, 60145, 60148, 60151, 60157}, - 'Total': set()} - -key_only_locations = { - 'Light World': set(), - 'Dark World': set(), - 'Desert Palace': {0x140031, 0x14002b, 0x140061, 0x140028}, - 'Eastern Palace': {0x14005b, 0x140049}, - 'Hyrule Castle': {0x140037, 0x140034, 0x14000d, 0x14003d}, - 'Agahnims Tower': {0x140061, 0x140052}, - 'Tower of Hera': set(), - 'Swamp Palace': {0x140019, 0x140016, 0x140013, 0x140010, 0x14000a}, - 'Thieves Town': {0x14005e, 0x14004f}, - 'Skull Woods': {0x14002e, 0x14001c}, - 'Ice Palace': {0x140004, 0x140022, 0x140025, 0x140046}, - 'Misery Mire': {0x140055, 0x14004c, 0x140064}, - 'Turtle Rock': {0x140058, 0x140007}, - 'Palace of Darkness': set(), - 'Ganons Tower': {0x140040, 0x140043, 0x14003a, 0x14001f}, - 'Total': set() -} - -location_to_area = {} -for area, locations in default_locations.items(): - for location in locations: - location_to_area[location] = area - -for area, locations in key_only_locations.items(): - for location in locations: - location_to_area[location] = area - -checks_in_area = {area: len(checks) for area, checks in default_locations.items()} -checks_in_area["Total"] = 216 - -ordered_areas = ('Light World', 'Dark World', 'Hyrule Castle', 'Agahnims Tower', 'Eastern Palace', 'Desert Palace', - 'Tower of Hera', 'Palace of Darkness', 'Swamp Palace', 'Skull Woods', 'Thieves Town', 'Ice Palace', - 'Misery Mire', 'Turtle Rock', 'Ganons Tower', "Total") - -tracking_ids = [] - -for item in tracking_names: - tracking_ids.append(get_alttp_id(item)) - -small_key_ids = {} -big_key_ids = {} -ids_small_key = {} -ids_big_key = {} - -for item_name, data in Items.item_table.items(): - if "Key" in item_name: - area = item_name.split("(")[1][:-1] - if "Small" in item_name: - small_key_ids[area] = data[2] - ids_small_key[data[2]] = area - else: - big_key_ids[area] = data[2] - ids_big_key[data[2]] = area - -# cleanup global namespace -del item_name -del data -del item - - -def attribute_item_solo(inventory, item): - """Adds item to inventory counter, converts everything to progressive.""" - target_item = links.get(item, item) - if item in levels: # non-progressive - inventory[target_item] = max(inventory[target_item], levels[item]) - else: - inventory[target_item] += 1 +# Multisave is currently updated, at most, every minute. +TRACKER_CACHE_TIMEOUT_IN_SECONDS = 60 +_multidata_cache = {} +_multiworld_trackers: Dict[str, Callable] = {} +_player_trackers: Dict[str, Callable] = {} -@app.template_filter() -def render_timedelta(delta: datetime.timedelta): - hours, minutes = divmod(delta.total_seconds() / 60, 60) - hours = str(int(hours)) - minutes = str(int(minutes)).zfill(2) - return f"{hours}:{minutes}" +TeamPlayer = Tuple[int, int] +ItemMetadata = Tuple[int, int, int] -@pass_context -def get_location_name(context: runtime.Context, loc: int) -> str: - # once all rooms embed data package, the chain lookup can be dropped - context_locations = context.get("custom_locations", {}) - return collections.ChainMap(context_locations, lookup_any_location_id_to_name).get(loc, loc) +def _cache_results(func: Callable) -> Callable: + """Stores the results of any computationally expensive methods after the initial call in TrackerData. + If called again, returns the cached result instead, as results will not change for the lifetime of TrackerData. + """ + def method_wrapper(self: "TrackerData", *args): + cache_key = f"{func.__name__}{''.join(f'_[{arg.__repr__()}]' for arg in args)}" + if cache_key in self._tracker_cache: + return self._tracker_cache[cache_key] + result = func(self, *args) + self._tracker_cache[cache_key] = result + return result -@pass_context -def get_item_name(context: runtime.Context, item: int) -> str: - context_items = context.get("custom_items", {}) - return collections.ChainMap(context_items, lookup_any_item_id_to_name).get(item, item) + return method_wrapper + + +@dataclass +class TrackerData: + """A helper dataclass that is instantiated each time an HTTP request comes in for tracker data. + + Provides helper methods to lazily load necessary data that each tracker require and caches any results so any + subsequent helper method calls do not need to recompute results during the lifetime of this instance. + """ + room: Room + _multidata: Dict[str, Any] + _multisave: Dict[str, Any] + _tracker_cache: Dict[str, Any] + + def __init__(self, room: Room): + """Initialize a new RoomMultidata object for the current room.""" + self.room = room + self._multidata = Context.decompress(room.seed.multidata) + self._multisave = restricted_loads(room.multisave) if room.multisave else {} + self._tracker_cache = {} + + self.item_name_to_id: Dict[str, Dict[str, int]] = {} + self.location_name_to_id: Dict[str, Dict[str, int]] = {} + + # Generate inverse lookup tables from data package, useful for trackers. + self.item_id_to_name: Dict[str, Dict[int, str]] = {} + self.location_id_to_name: Dict[str, Dict[int, str]] = {} + for game, game_package in self._multidata["datapackage"].items(): + game_package = restricted_loads(GameDataPackage.get(checksum=game_package["checksum"]).data) + self.item_id_to_name[game] = {id: name for name, id in game_package["item_name_to_id"].items()} + self.location_id_to_name[game] = {id: name for name, id in game_package["location_name_to_id"].items()} + + # Normal lookup tables as well. + self.item_name_to_id[game] = game_package["item_name_to_id"] + self.location_name_to_id[game] = game_package["item_name_to_id"] + + def get_seed_name(self) -> str: + """Retrieves the seed name.""" + return self._multidata["seed_name"] + + def get_slot_data(self, team: int, player: int) -> Dict[str, Any]: + """Retrieves the slot data for a given player.""" + return self._multidata["slot_data"][player] + + def get_slot_info(self, team: int, player: int) -> NetworkSlot: + """Retrieves the NetworkSlot data for a given player.""" + return self._multidata["slot_info"][player] + + def get_player_name(self, team: int, player: int) -> str: + """Retrieves the slot name for a given player.""" + return self.get_slot_info(team, player).name + + def get_player_game(self, team: int, player: int) -> str: + """Retrieves the game for a given player.""" + return self.get_slot_info(team, player).game + + def get_player_locations(self, team: int, player: int) -> Dict[int, ItemMetadata]: + """Retrieves all locations with their containing item's metadata for a given player.""" + return self._multidata["locations"][player] + + def get_player_starting_inventory(self, team: int, player: int) -> List[int]: + """Retrieves a list of all item codes a given slot starts with.""" + return self._multidata["precollected_items"][player] + + def get_player_checked_locations(self, team: int, player: int) -> Set[int]: + """Retrieves the set of all locations marked complete by this player.""" + return self._multisave.get("location_checks", {}).get((team, player), set()) + + @_cache_results + def get_player_missing_locations(self, team: int, player: int) -> Set[int]: + """Retrieves the set of all locations not marked complete by this player.""" + return set(self.get_player_locations(team, player)) - self.get_player_checked_locations(team, player) + + def get_player_received_items(self, team: int, player: int) -> List[NetworkItem]: + """Returns all items received to this player in order of received.""" + return self._multisave.get("received_items", {}).get((team, player, True), []) + + @_cache_results + def get_player_inventory_counts(self, team: int, player: int) -> Dict[int, int]: + """Retrieves a dictionary of all items received by their id and their received count.""" + items = self.get_player_received_items(team, player) + inventory = {item: 0 for item in self.item_id_to_name[self.get_player_game(team, player)]} + for item in items: + inventory[item.item] += 1 + + return inventory + + @_cache_results + def get_player_hints(self, team: int, player: int) -> Set[Hint]: + """Retrieves a set of all hints relevant for a particular player.""" + return self._multisave.get("hints", {}).get((team, player), set()) + + @_cache_results + def get_player_last_activity(self, team: int, player: int) -> Optional[datetime.timedelta]: + """Retrieves the relative timedelta for when a particular player was last active. + Returns None if no activity was ever recorded. + """ + return self.get_room_last_activity().get((team, player), None) + + def get_player_client_status(self, team: int, player: int) -> ClientStatus: + """Retrieves the ClientStatus of a particular player.""" + return self._multisave.get("client_game_state", {}).get((team, player), ClientStatus.CLIENT_UNKNOWN) + + def get_player_alias(self, team: int, player: int) -> Optional[str]: + """Returns the alias of a particular player, if any.""" + return self._multisave.get("name_aliases", {}).get((team, player), None) + + @_cache_results + def get_team_completed_worlds_count(self) -> Dict[int, int]: + """Retrieves a dictionary of number of completed worlds per team.""" + return { + team: sum( + self.get_player_client_status(team, player) == ClientStatus.CLIENT_GOAL + for player in players if self.get_slot_info(team, player).type == SlotType.player + ) for team, players in self.get_team_players().items() + } + @_cache_results + def get_team_hints(self) -> Dict[int, Set[Hint]]: + """Retrieves a dictionary of all hints per team.""" + hints = {} + for team, players in self.get_team_players().items(): + hints[team] = set() + for player in players: + hints[team] |= self.get_player_hints(team, player) + + return hints + + @_cache_results + def get_team_locations_total_count(self) -> Dict[int, int]: + """Retrieves a dictionary of total player locations each team has.""" + return { + team: sum(len(self.get_player_locations(team, player)) for player in players) + for team, players in self.get_team_players().items() + } -app.jinja_env.filters["location_name"] = get_location_name -app.jinja_env.filters["item_name"] = get_item_name + @_cache_results + def get_team_locations_checked_count(self) -> Dict[int, int]: + """Retrieves a dictionary of checked player locations each team has.""" + return { + team: sum(len(self.get_player_checked_locations(team, player)) for player in players) + for team, players in self.get_team_players().items() + } + # TODO: Change this method to properly build for each team once teams are properly implemented, as they don't + # currently exist in multidata to easily look up, so these are all assuming only 1 team: Team #0 + @_cache_results + def get_team_players(self) -> Dict[int, List[int]]: + """Retrieves a dictionary of all players ids on each team.""" + return { + 0: [player for player, slot_info in self._multidata["slot_info"].items()] + } -_multidata_cache = {} + @_cache_results + def get_room_saving_second(self) -> int: + """Retrieves the saving second value for this seed. + Useful for knowing when the multisave gets updated so trackers can attempt to update. + """ + return get_saving_second(self.get_seed_name()) -def get_location_table(checks_table: dict) -> dict: - loc_to_area = {} - for area, locations in checks_table.items(): - if area == "Total": - continue - for location in locations: - loc_to_area[location] = area - return loc_to_area + @_cache_results + def get_room_locations(self) -> Dict[TeamPlayer, Dict[int, ItemMetadata]]: + """Retrieves a dictionary of all locations and their associated item metadata per player.""" + return { + (team, player): self.get_player_locations(team, player) + for team, players in self.get_team_players().items() for player in players + } + @_cache_results + def get_room_games(self) -> Dict[TeamPlayer, str]: + """Retrieves a dictionary of games for each player.""" + return { + (team, player): self.get_player_game(team, player) + for team, players in self.get_team_players().items() for player in players + } -def get_static_room_data(room: Room): - result = _multidata_cache.get(room.seed.id, None) - if result: - return result - multidata = Context.decompress(room.seed.multidata) - # in > 100 players this can take a bit of time and is the main reason for the cache - locations: Dict[int, Dict[int, Tuple[int, int, int]]] = multidata['locations'] - names: List[List[str]] = multidata.get("names", []) - games = multidata.get("games", {}) - groups = {} - custom_locations = {} - custom_items = {} - if "slot_info" in multidata: - slot_info_dict: Dict[int, NetworkSlot] = multidata["slot_info"] - games = {slot: slot_info.game for slot, slot_info in slot_info_dict.items()} - groups = {slot: slot_info.group_members for slot, slot_info in slot_info_dict.items() - if slot_info.type == SlotType.group} - names = [[slot_info.name for slot, slot_info in sorted(slot_info_dict.items())]] - for game in games.values(): - if game not in multidata["datapackage"]: - continue - game_data = multidata["datapackage"][game] - if "checksum" in game_data: - if network_data_package["games"].get(game, {}).get("checksum") == game_data["checksum"]: - # non-custom. remove from multidata - # network_data_package import could be skipped once all rooms embed data package - del multidata["datapackage"][game] - continue - else: - game_data = restricted_loads(GameDataPackage.get(checksum=game_data["checksum"]).data) - custom_locations.update( - {id_: name for name, id_ in game_data["location_name_to_id"].items()}) - custom_items.update( - {id_: name for name, id_ in game_data["item_name_to_id"].items()}) - - seed_checks_in_area = checks_in_area.copy() - - use_door_tracker = False - if "tags" in multidata: - use_door_tracker = "DR" in multidata["tags"] - if use_door_tracker: - for area, checks in key_only_locations.items(): - seed_checks_in_area[area] += len(checks) - seed_checks_in_area["Total"] = 249 - - player_checks_in_area = { - playernumber: { - areaname: len(multidata["checks_in_area"][playernumber][areaname]) if areaname != "Total" else - multidata["checks_in_area"][playernumber]["Total"] - for areaname in ordered_areas + @_cache_results + def get_room_locations_complete(self) -> Dict[TeamPlayer, int]: + """Retrieves a dictionary of all locations complete per player.""" + return { + (team, player): len(self.get_player_checked_locations(team, player)) + for team, players in self.get_team_players().items() for player in players } - for playernumber in multidata["checks_in_area"] - } - player_location_to_area = {playernumber: get_location_table(multidata["checks_in_area"][playernumber]) - for playernumber in multidata["checks_in_area"]} - saving_second = get_saving_second(multidata["seed_name"]) - result = locations, names, use_door_tracker, player_checks_in_area, player_location_to_area, \ - multidata["precollected_items"], games, multidata["slot_data"], groups, saving_second, \ - custom_locations, custom_items - _multidata_cache[room.seed.id] = result - return result + @_cache_results + def get_room_client_statuses(self) -> Dict[TeamPlayer, ClientStatus]: + """Retrieves a dictionary of all ClientStatus values per player.""" + return { + (team, player): self.get_player_client_status(team, player) + for team, players in self.get_team_players().items() for player in players + } + + @_cache_results + def get_room_long_player_names(self) -> Dict[TeamPlayer, str]: + """Retrieves a dictionary of names with aliases for each player.""" + long_player_names = {} + for team, players in self.get_team_players().items(): + for player in players: + alias = self.get_player_alias(team, player) + if alias: + long_player_names[team, player] = f"{alias} ({self.get_player_name(team, player)})" + else: + long_player_names[team, player] = self.get_player_name(team, player) + + return long_player_names + @_cache_results + def get_room_last_activity(self) -> Dict[TeamPlayer, datetime.timedelta]: + """Retrieves a dictionary of all players and the timedelta from now to their last activity. + Does not include players who have no activity recorded. + """ + last_activity: Dict[TeamPlayer, datetime.timedelta] = {} + now = datetime.datetime.utcnow() + for (team, player), timestamp in self._multisave.get("client_activity_timers", []): + last_activity[team, player] = now - datetime.datetime.utcfromtimestamp(timestamp) -@app.route('/tracker///') -def get_player_tracker(tracker: UUID, tracked_team: int, tracked_player: int, want_generic: bool = False): - key = f"{tracker}_{tracked_team}_{tracked_player}_{want_generic}" + return last_activity + + @_cache_results + def get_room_videos(self) -> Dict[TeamPlayer, Tuple[str, str]]: + """Retrieves a dictionary of any players who have video streaming enabled and their feeds. + + Only supported platforms are Twitch and YouTube. + """ + video_feeds = {} + for (team, player), video_data in self._multisave.get("video", []): + video_feeds[team, player] = video_data + + return video_feeds + + +@app.route("/tracker///") +def get_player_tracker(tracker: UUID, tracked_team: int, tracked_player: int, generic: bool = False) -> str: + key = f"{tracker}_{tracked_team}_{tracked_player}_{generic}" tracker_page = cache.get(key) if tracker_page: return tracker_page - timeout, tracker_page = _get_player_tracker(tracker, tracked_team, tracked_player, want_generic) + + timeout, tracker_page = get_timeout_and_tracker(tracker, tracked_team, tracked_player, generic) cache.set(key, tracker_page, timeout) return tracker_page -def _get_player_tracker(tracker: UUID, tracked_team: int, tracked_player: int, want_generic: bool): - # Team and player must be positive and greater than zero - if tracked_team < 0 or tracked_player < 1: - abort(404) +@app.route("/generic_tracker///") +def get_generic_game_tracker(tracker: UUID, tracked_team: int, tracked_player: int) -> str: + return get_player_tracker(tracker, tracked_team, tracked_player, True) + - room: Optional[Room] = Room.get(tracker=tracker) +@app.route("/tracker/", defaults={"game": "Generic"}) +@app.route("/tracker//") +@cache.memoize(timeout=TRACKER_CACHE_TIMEOUT_IN_SECONDS) +def get_multiworld_tracker(tracker: UUID, game: str): + # Room must exist. + room = Room.get(tracker=tracker) if not room: abort(404) - # Collect seed information and pare it down to a single player - locations, names, use_door_tracker, seed_checks_in_area, player_location_to_area, \ - precollected_items, games, slot_data, groups, saving_second, custom_locations, custom_items = \ - get_static_room_data(room) - player_name = names[tracked_team][tracked_player - 1] - location_to_area = player_location_to_area.get(tracked_player, {}) - inventory = collections.Counter() - checks_done = {loc_name: 0 for loc_name in default_locations} - - # Add starting items to inventory - starting_items = precollected_items[tracked_player] - if starting_items: - for item_id in starting_items: - attribute_item_solo(inventory, item_id) - - if room.multisave: - multisave: Dict[str, Any] = restricted_loads(room.multisave) - else: - multisave: Dict[str, Any] = {} - - slots_aimed_at_player = {tracked_player} - for group_id, group_members in groups.items(): - if tracked_player in group_members: - slots_aimed_at_player.add(group_id) - - # Add items to player inventory - for (ms_team, ms_player), locations_checked in multisave.get("location_checks", {}).items(): - # Skip teams and players not matching the request - player_locations = locations[ms_player] - if ms_team == tracked_team: - # If the player does not have the item, do nothing - for location in locations_checked: - if location in player_locations: - item, recipient, flags = player_locations[location] - if recipient in slots_aimed_at_player: # a check done for the tracked player - attribute_item_solo(inventory, item) - if ms_player == tracked_player: # a check done by the tracked player - area_name = location_to_area.get(location, None) - if area_name: - checks_done[area_name] += 1 - checks_done["Total"] += 1 - specific_tracker = game_specific_trackers.get(games[tracked_player], None) - if specific_tracker and not want_generic: - tracker = specific_tracker(multisave, room, locations, inventory, tracked_team, tracked_player, player_name, - seed_checks_in_area, checks_done, slot_data[tracked_player], saving_second) - else: - tracker = __renderGenericTracker(multisave, room, locations, inventory, tracked_team, tracked_player, - player_name, seed_checks_in_area, checks_done, saving_second, - custom_locations, custom_items) + tracker_data = TrackerData(room) + enabled_trackers = list(get_enabled_multiworld_trackers(room).keys()) + if game not in _multiworld_trackers: + return render_generic_multiworld_tracker(tracker_data, enabled_trackers) - return (saving_second - datetime.datetime.now().second) % 60 or 60, tracker + return _multiworld_trackers[game](tracker_data, enabled_trackers) -@app.route('/generic_tracker///') -def get_generic_tracker(tracker: UUID, tracked_team: int, tracked_player: int): - return get_player_tracker(tracker, tracked_team, tracked_player, True) +def get_timeout_and_tracker(tracker: UUID, tracked_team: int, tracked_player: int, generic: bool) -> Tuple[int, str]: + # Room must exist. + room = Room.get(tracker=tracker) + if not room: + abort(404) + tracker_data = TrackerData(room) -def __renderAlttpTracker(multisave: Dict[str, Any], room: Room, locations: Dict[int, Dict[int, Tuple[int, int, int]]], - inventory: Counter, team: int, player: int, player_name: str, - seed_checks_in_area: Dict[int, Dict[str, int]], checks_done: Dict[str, int], slot_data: Dict, - saving_second: int) -> str: + # Load and render the game-specific player tracker, or fallback to generic tracker if none exists. + game_specific_tracker = _player_trackers.get(tracker_data.get_player_game(tracked_team, tracked_player), None) + if game_specific_tracker and not generic: + tracker = game_specific_tracker(tracker_data, tracked_team, tracked_player) + else: + tracker = render_generic_tracker(tracker_data, tracked_team, tracked_player) - # Note the presence of the triforce item - game_state = multisave.get("client_game_state", {}).get((team, player), 0) - if game_state == 30: - inventory[106] = 1 # Triforce + return (tracker_data.get_room_saving_second() - datetime.datetime.now().second) % 60 or 60, tracker - # Progressive items need special handling for icons and class - progressive_items = { - "Progressive Sword": 94, - "Progressive Glove": 97, - "Progressive Bow": 100, - "Progressive Mail": 96, - "Progressive Shield": 95, - } - progressive_names = { - "Progressive Sword": [None, 'Fighter Sword', 'Master Sword', 'Tempered Sword', 'Golden Sword'], - "Progressive Glove": [None, 'Power Glove', 'Titan Mitts'], - "Progressive Bow": [None, "Bow", "Silver Bow"], - "Progressive Mail": ["Green Mail", "Blue Mail", "Red Mail"], - "Progressive Shield": [None, "Blue Shield", "Red Shield", "Mirror Shield"] - } - # Determine which icon to use - display_data = {} - for item_name, item_id in progressive_items.items(): - level = min(inventory[item_id], len(progressive_names[item_name]) - 1) - display_name = progressive_names[item_name][level] - acquired = True - if not display_name: - acquired = False - display_name = progressive_names[item_name][level + 1] - base_name = item_name.split(maxsplit=1)[1].lower() - display_data[base_name + "_acquired"] = acquired - display_data[base_name + "_url"] = alttp_icons[display_name] - - # The single player tracker doesn't care about overworld, underworld, and total checks. Maybe it should? - sp_areas = ordered_areas[2:15] - - player_big_key_locations = set() - player_small_key_locations = set() - for loc_data in locations.values(): - for values in loc_data.values(): - item_id, item_player, flags = values - if item_player == player: - if item_id in ids_big_key: - player_big_key_locations.add(ids_big_key[item_id]) - elif item_id in ids_small_key: - player_small_key_locations.add(ids_small_key[item_id]) - - return render_template("lttpTracker.html", inventory=inventory, - player_name=player_name, room=room, icons=alttp_icons, checks_done=checks_done, - checks_in_area=seed_checks_in_area[player], - acquired_items={lookup_any_item_id_to_name[id] for id in inventory}, - small_key_ids=small_key_ids, big_key_ids=big_key_ids, sp_areas=sp_areas, - key_locations=player_small_key_locations, - big_key_locations=player_big_key_locations, - **display_data) - - -def __renderMinecraftTracker(multisave: Dict[str, Any], room: Room, locations: Dict[int, Dict[int, Tuple[int, int, int]]], - inventory: Counter, team: int, player: int, playerName: str, - seed_checks_in_area: Dict[int, Dict[str, int]], checks_done: Dict[str, int], slot_data: Dict, - saving_second: int) -> str: - - icons = { - "Wooden Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/d/d2/Wooden_Pickaxe_JE3_BE3.png", - "Stone Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/c4/Stone_Pickaxe_JE2_BE2.png", - "Iron Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/d/d1/Iron_Pickaxe_JE3_BE2.png", - "Diamond Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/e/e7/Diamond_Pickaxe_JE3_BE3.png", - "Wooden Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/d/d5/Wooden_Sword_JE2_BE2.png", - "Stone Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/b/b1/Stone_Sword_JE2_BE2.png", - "Iron Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/8/8e/Iron_Sword_JE2_BE2.png", - "Diamond Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/4/44/Diamond_Sword_JE3_BE3.png", - "Leather Tunic": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/b/b7/Leather_Tunic_JE4_BE2.png", - "Iron Chestplate": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/31/Iron_Chestplate_JE2_BE2.png", - "Diamond Chestplate": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/e/e0/Diamond_Chestplate_JE3_BE2.png", - "Iron Ingot": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/fc/Iron_Ingot_JE3_BE2.png", - "Block of Iron": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/7/7e/Block_of_Iron_JE4_BE3.png", - "Brewing Stand": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/b/b3/Brewing_Stand_%28empty%29_JE10.png", - "Ender Pearl": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/f6/Ender_Pearl_JE3_BE2.png", - "Bucket": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/fc/Bucket_JE2_BE2.png", - "Bow": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/a/ab/Bow_%28Pull_2%29_JE1_BE1.png", - "Shield": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/c6/Shield_JE2_BE1.png", - "Red Bed": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/6/6a/Red_Bed_%28N%29.png", - "Netherite Scrap": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/33/Netherite_Scrap_JE2_BE1.png", - "Flint and Steel": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/9/94/Flint_and_Steel_JE4_BE2.png", - "Enchanting Table": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/31/Enchanting_Table.gif", - "Fishing Rod": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/7/7f/Fishing_Rod_JE2_BE2.png", - "Campfire": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/9/91/Campfire_JE2_BE2.gif", - "Water Bottle": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/7/75/Water_Bottle_JE2_BE2.png", - "Spyglass": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/c1/Spyglass_JE2_BE1.png", - "Dragon Egg Shard": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/38/Dragon_Egg_JE4.png", - "Lead": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/1/1f/Lead_JE2_BE2.png", - "Saddle": "https://i.imgur.com/2QtDyR0.png", - "Channeling Book": "https://i.imgur.com/J3WsYZw.png", - "Silk Touch Book": "https://i.imgur.com/iqERxHQ.png", - "Piercing IV Book": "https://i.imgur.com/OzJptGz.png", - } +def get_enabled_multiworld_trackers(room: Room) -> Dict[str, Callable]: + # Render the multitracker for any games that exist in the current room if they are defined. + enabled_trackers = {} + for game_name, endpoint in _multiworld_trackers.items(): + if any(slot.game == game_name for slot in room.seed.slots): + enabled_trackers[game_name] = endpoint - minecraft_location_ids = { - "Story": [42073, 42023, 42027, 42039, 42002, 42009, 42010, 42070, - 42041, 42049, 42004, 42031, 42025, 42029, 42051, 42077], - "Nether": [42017, 42044, 42069, 42058, 42034, 42060, 42066, 42076, 42064, 42071, 42021, - 42062, 42008, 42061, 42033, 42011, 42006, 42019, 42000, 42040, 42001, 42015, 42104, 42014], - "The End": [42052, 42005, 42012, 42032, 42030, 42042, 42018, 42038, 42046], - "Adventure": [42047, 42050, 42096, 42097, 42098, 42059, 42055, 42072, 42003, 42109, 42035, 42016, 42020, - 42048, 42054, 42068, 42043, 42106, 42074, 42075, 42024, 42026, 42037, 42045, 42056, 42105, 42099, 42103, 42110, 42100], - "Husbandry": [42065, 42067, 42078, 42022, 42113, 42107, 42007, 42079, 42013, 42028, 42036, 42108, 42111, 42112, - 42057, 42063, 42053, 42102, 42101, 42092, 42093, 42094, 42095], - "Archipelago": [42080, 42081, 42082, 42083, 42084, 42085, 42086, 42087, 42088, 42089, 42090, 42091], + # We resort the tracker to have Generic first, then lexicographically each enabled game. + return { + "Generic": render_generic_multiworld_tracker, + **{key: enabled_trackers[key] for key in sorted(enabled_trackers.keys())}, } - display_data = {} - # Determine display for progressive items - progressive_items = { - "Progressive Tools": 45013, - "Progressive Weapons": 45012, - "Progressive Armor": 45014, - "Progressive Resource Crafting": 45001 - } - progressive_names = { - "Progressive Tools": ["Wooden Pickaxe", "Stone Pickaxe", "Iron Pickaxe", "Diamond Pickaxe"], - "Progressive Weapons": ["Wooden Sword", "Stone Sword", "Iron Sword", "Diamond Sword"], - "Progressive Armor": ["Leather Tunic", "Iron Chestplate", "Diamond Chestplate"], - "Progressive Resource Crafting": ["Iron Ingot", "Iron Ingot", "Block of Iron"] - } - for item_name, item_id in progressive_items.items(): - level = min(inventory[item_id], len(progressive_names[item_name]) - 1) - display_name = progressive_names[item_name][level] - base_name = item_name.split(maxsplit=1)[1].lower().replace(' ', '_') - display_data[base_name + "_url"] = icons[display_name] - - # Multi-items - multi_items = { - "3 Ender Pearls": 45029, - "8 Netherite Scrap": 45015, - "Dragon Egg Shard": 45043 - } - for item_name, item_id in multi_items.items(): - base_name = item_name.split()[-1].lower() - count = inventory[item_id] - if count >= 0: - display_data[base_name + "_count"] = count +def render_generic_tracker(tracker_data: TrackerData, team: int, player: int) -> str: + game = tracker_data.get_player_game(team, player) + + # Add received index to all received items, excluding starting inventory. + received_items_in_order = {} + for received_index, network_item in enumerate(tracker_data.get_player_received_items(team, player), start=1): + received_items_in_order[network_item.item] = received_index + + return render_template( + template_name_or_list="genericTracker.html", + game_specific_tracker=game in _player_trackers, + room=tracker_data.room, + team=team, + player=player, + player_name=tracker_data.get_room_long_player_names()[team, player], + inventory=tracker_data.get_player_inventory_counts(team, player), + locations=tracker_data.get_player_locations(team, player), + checked_locations=tracker_data.get_player_checked_locations(team, player), + received_items=received_items_in_order, + saving_second=tracker_data.get_room_saving_second(), + game=game, + games=tracker_data.get_room_games(), + player_names_with_alias=tracker_data.get_room_long_player_names(), + location_id_to_name=tracker_data.location_id_to_name, + item_id_to_name=tracker_data.item_id_to_name, + hints=tracker_data.get_player_hints(team, player), + ) - # Victory condition - game_state = multisave.get("client_game_state", {}).get((team, player), 0) - display_data['game_finished'] = game_state == 30 - - # Turn location IDs into advancement tab counts - checked_locations = multisave.get("location_checks", {}).get((team, player), set()) - lookup_name = lambda id: lookup_any_location_id_to_name[id] - location_info = {tab_name: {lookup_name(id): (id in checked_locations) for id in tab_locations} - for tab_name, tab_locations in minecraft_location_ids.items()} - checks_done = {tab_name: len([id for id in tab_locations if id in checked_locations]) - for tab_name, tab_locations in minecraft_location_ids.items()} - checks_done['Total'] = len(checked_locations) - checks_in_area = {tab_name: len(tab_locations) for tab_name, tab_locations in minecraft_location_ids.items()} - checks_in_area['Total'] = sum(checks_in_area.values()) - - return render_template("minecraftTracker.html", - inventory=inventory, icons=icons, - acquired_items={lookup_any_item_id_to_name[id] for id in inventory if - id in lookup_any_item_id_to_name}, - player=player, team=team, room=room, player_name=playerName, saving_second = saving_second, - checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, - **display_data) - - -def __renderOoTTracker(multisave: Dict[str, Any], room: Room, locations: Dict[int, Dict[int, Tuple[int, int, int]]], - inventory: Counter, team: int, player: int, playerName: str, - seed_checks_in_area: Dict[int, Dict[str, int]], checks_done: Dict[str, int], slot_data: Dict, - saving_second: int) -> str: - - icons = { - "Fairy Ocarina": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/97/OoT_Fairy_Ocarina_Icon.png", - "Ocarina of Time": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/4/4e/OoT_Ocarina_of_Time_Icon.png", - "Slingshot": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/3/32/OoT_Fairy_Slingshot_Icon.png", - "Boomerang": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/d/d5/OoT_Boomerang_Icon.png", - "Bottle": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/f/fc/OoT_Bottle_Icon.png", - "Rutos Letter": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/OoT_Letter_Icon.png", - "Bombs": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/1/11/OoT_Bomb_Icon.png", - "Bombchus": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/3/36/OoT_Bombchu_Icon.png", - "Lens of Truth": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/0/05/OoT_Lens_of_Truth_Icon.png", - "Bow": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/9a/OoT_Fairy_Bow_Icon.png", - "Hookshot": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/7/77/OoT_Hookshot_Icon.png", - "Longshot": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/a/a4/OoT_Longshot_Icon.png", - "Megaton Hammer": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/93/OoT_Megaton_Hammer_Icon.png", - "Fire Arrows": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/1/1e/OoT_Fire_Arrow_Icon.png", - "Ice Arrows": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/3/3c/OoT_Ice_Arrow_Icon.png", - "Light Arrows": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/7/76/OoT_Light_Arrow_Icon.png", - "Dins Fire": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/d/da/OoT_Din%27s_Fire_Icon.png", - "Farores Wind": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/7/7a/OoT_Farore%27s_Wind_Icon.png", - "Nayrus Love": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/b/be/OoT_Nayru%27s_Love_Icon.png", - "Kokiri Sword": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/5/53/OoT_Kokiri_Sword_Icon.png", - "Biggoron Sword": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/2e/OoT_Giant%27s_Knife_Icon.png", - "Mirror Shield": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/b/b0/OoT_Mirror_Shield_Icon_2.png", - "Goron Bracelet": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/b/b7/OoT_Goron%27s_Bracelet_Icon.png", - "Silver Gauntlets": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/b/b9/OoT_Silver_Gauntlets_Icon.png", - "Golden Gauntlets": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/6/6a/OoT_Golden_Gauntlets_Icon.png", - "Goron Tunic": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/1/1c/OoT_Goron_Tunic_Icon.png", - "Zora Tunic": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/2c/OoT_Zora_Tunic_Icon.png", - "Silver Scale": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/4/4e/OoT_Silver_Scale_Icon.png", - "Gold Scale": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/95/OoT_Golden_Scale_Icon.png", - "Iron Boots": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/3/34/OoT_Iron_Boots_Icon.png", - "Hover Boots": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/22/OoT_Hover_Boots_Icon.png", - "Adults Wallet": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/f/f9/OoT_Adult%27s_Wallet_Icon.png", - "Giants Wallet": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/8/87/OoT_Giant%27s_Wallet_Icon.png", - "Small Magic": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/9f/OoT3D_Magic_Jar_Icon.png", - "Large Magic": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/3/3e/OoT3D_Large_Magic_Jar_Icon.png", - "Gerudo Membership Card": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/4/4e/OoT_Gerudo_Token_Icon.png", - "Gold Skulltula Token": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/4/47/OoT_Token_Icon.png", - "Triforce Piece": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/0/0b/SS_Triforce_Piece_Icon.png", - "Triforce": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/6/68/ALttP_Triforce_Title_Sprite.png", - "Zeldas Lullaby": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", - "Eponas Song": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", - "Sarias Song": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", - "Suns Song": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", - "Song of Time": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", - "Song of Storms": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", - "Minuet of Forest": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/e/e4/Green_Note.png", - "Bolero of Fire": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/f/f0/Red_Note.png", - "Serenade of Water": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/0/0f/Blue_Note.png", - "Requiem of Spirit": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/a/a4/Orange_Note.png", - "Nocturne of Shadow": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/97/Purple_Note.png", - "Prelude of Light": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/90/Yellow_Note.png", - "Small Key": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/e/e5/OoT_Small_Key_Icon.png", - "Boss Key": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/4/40/OoT_Boss_Key_Icon.png", - } - display_data = {} +def render_generic_multiworld_tracker(tracker_data: TrackerData, enabled_trackers: List[str]) -> str: + return render_template( + "multitracker.html", + enabled_trackers=enabled_trackers, + current_tracker="Generic", + room=tracker_data.room, + room_players=tracker_data.get_team_players(), + locations=tracker_data.get_room_locations(), + locations_complete=tracker_data.get_room_locations_complete(), + total_team_locations=tracker_data.get_team_locations_total_count(), + total_team_locations_complete=tracker_data.get_team_locations_checked_count(), + player_names_with_alias=tracker_data.get_room_long_player_names(), + completed_worlds=tracker_data.get_team_completed_worlds_count(), + games=tracker_data.get_room_games(), + states=tracker_data.get_room_client_statuses(), + hints=tracker_data.get_team_hints(), + activity_timers=tracker_data.get_room_last_activity(), + videos=tracker_data.get_room_videos(), + item_id_to_name=tracker_data.item_id_to_name, + location_id_to_name=tracker_data.location_id_to_name, + ) - # Determine display for progressive items - progressive_items = { - "Progressive Hookshot": 66128, - "Progressive Strength Upgrade": 66129, - "Progressive Wallet": 66133, - "Progressive Scale": 66134, - "Magic Meter": 66138, - "Ocarina": 66139, - } - progressive_names = { - "Progressive Hookshot": ["Hookshot", "Hookshot", "Longshot"], - "Progressive Strength Upgrade": ["Goron Bracelet", "Goron Bracelet", "Silver Gauntlets", "Golden Gauntlets"], - "Progressive Wallet": ["Adults Wallet", "Adults Wallet", "Giants Wallet", "Giants Wallet"], - "Progressive Scale": ["Silver Scale", "Silver Scale", "Gold Scale"], - "Magic Meter": ["Small Magic", "Small Magic", "Large Magic"], - "Ocarina": ["Fairy Ocarina", "Fairy Ocarina", "Ocarina of Time"] - } +# TODO: This is a temporary solution until a proper Tracker API can be implemented for tracker templates and data to +# live in their respective world folders. +import collections - for item_name, item_id in progressive_items.items(): - level = min(inventory[item_id], len(progressive_names[item_name])-1) - display_name = progressive_names[item_name][level] - if item_name.startswith("Progressive"): - base_name = item_name.split(maxsplit=1)[1].lower().replace(' ', '_') - else: - base_name = item_name.lower().replace(' ', '_') - display_data[base_name+"_url"] = icons[display_name] - - if base_name == "hookshot": - display_data['hookshot_length'] = {0: '', 1: 'H', 2: 'L'}.get(level) - if base_name == "wallet": - display_data['wallet_size'] = {0: '99', 1: '200', 2: '500', 3: '999'}.get(level) - - # Determine display for bottles. Show letter if it's obtained, determine bottle count - bottle_ids = [66015, 66020, 66021, 66140, 66141, 66142, 66143, 66144, 66145, 66146, 66147, 66148] - display_data['bottle_count'] = min(sum(map(lambda item_id: inventory[item_id], bottle_ids)), 4) - display_data['bottle_url'] = icons['Rutos Letter'] if inventory[66021] > 0 else icons['Bottle'] - - # Determine bombchu display - display_data['has_bombchus'] = any(map(lambda item_id: inventory[item_id] > 0, [66003, 66106, 66107, 66137])) - - # Multi-items - multi_items = { - "Gold Skulltula Token": 66091, - "Triforce Piece": 66202, - } - for item_name, item_id in multi_items.items(): - base_name = item_name.split()[-1].lower() - display_data[base_name+"_count"] = inventory[item_id] - - # Gather dungeon locations - area_id_ranges = { - "Overworld": ((67000, 67263), (67269, 67280), (67747, 68024), (68054, 68062)), - "Deku Tree": ((67281, 67303), (68063, 68077)), - "Dodongo's Cavern": ((67304, 67334), (68078, 68160)), - "Jabu Jabu's Belly": ((67335, 67359), (68161, 68188)), - "Bottom of the Well": ((67360, 67384), (68189, 68230)), - "Forest Temple": ((67385, 67420), (68231, 68281)), - "Fire Temple": ((67421, 67457), (68282, 68350)), - "Water Temple": ((67458, 67484), (68351, 68483)), - "Shadow Temple": ((67485, 67532), (68484, 68565)), - "Spirit Temple": ((67533, 67582), (68566, 68625)), - "Ice Cavern": ((67583, 67596), (68626, 68649)), - "Gerudo Training Ground": ((67597, 67635), (68650, 68656)), - "Thieves' Hideout": ((67264, 67268), (68025, 68053)), - "Ganon's Castle": ((67636, 67673), (68657, 68705)), - } +from worlds import network_data_package - def lookup_and_trim(id, area): - full_name = lookup_any_location_id_to_name[id] - if 'Ganons Tower' in full_name: - return full_name - if area not in ["Overworld", "Thieves' Hideout"]: - # trim dungeon name. leaves an extra space that doesn't display, or trims fully for DC/Jabu/GC - return full_name[len(area):] - return full_name - - checked_locations = multisave.get("location_checks", {}).get((team, player), set()).intersection(set(locations[player])) - location_info = {} - checks_done = {} - checks_in_area = {} - for area, ranges in area_id_ranges.items(): - location_info[area] = {} - checks_done[area] = 0 - checks_in_area[area] = 0 - for r in ranges: - min_id, max_id = r - for id in range(min_id, max_id+1): - if id in locations[player]: - checked = id in checked_locations - location_info[area][lookup_and_trim(id, area)] = checked - checks_in_area[area] += 1 - checks_done[area] += checked - - checks_done['Total'] = sum(checks_done.values()) - checks_in_area['Total'] = sum(checks_in_area.values()) - - # Give skulltulas on non-tracked locations - non_tracked_locations = multisave.get("location_checks", {}).get((team, player), set()).difference(set(locations[player])) - for id in non_tracked_locations: - if "GS" in lookup_and_trim(id, ''): - display_data["token_count"] += 1 - - oot_y = '✔' - oot_x = '✕' - - # Gather small and boss key info - small_key_counts = { - "Forest Temple": oot_y if inventory[66203] else inventory[66175], - "Fire Temple": oot_y if inventory[66204] else inventory[66176], - "Water Temple": oot_y if inventory[66205] else inventory[66177], - "Spirit Temple": oot_y if inventory[66206] else inventory[66178], - "Shadow Temple": oot_y if inventory[66207] else inventory[66179], - "Bottom of the Well": oot_y if inventory[66208] else inventory[66180], - "Gerudo Training Ground": oot_y if inventory[66209] else inventory[66181], - "Thieves' Hideout": oot_y if inventory[66210] else inventory[66182], - "Ganon's Castle": oot_y if inventory[66211] else inventory[66183], - } - boss_key_counts = { - "Forest Temple": oot_y if inventory[66149] else oot_x, - "Fire Temple": oot_y if inventory[66150] else oot_x, - "Water Temple": oot_y if inventory[66151] else oot_x, - "Spirit Temple": oot_y if inventory[66152] else oot_x, - "Shadow Temple": oot_y if inventory[66153] else oot_x, - "Ganon's Castle": oot_y if inventory[66154] else oot_x, - } - # Victory condition - game_state = multisave.get("client_game_state", {}).get((team, player), 0) - display_data['game_finished'] = game_state == 30 - - return render_template("ootTracker.html", - inventory=inventory, player=player, team=team, room=room, player_name=playerName, - icons=icons, acquired_items={lookup_any_item_id_to_name[id] for id in inventory}, - checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, - small_key_counts=small_key_counts, boss_key_counts=boss_key_counts, - **display_data) - - -def __renderTimespinnerTracker(multisave: Dict[str, Any], room: Room, locations: Dict[int, Dict[int, Tuple[int, int, int]]], - inventory: Counter, team: int, player: int, playerName: str, - seed_checks_in_area: Dict[int, Dict[str, int]], checks_done: Dict[str, int], - slot_data: Dict[str, Any], saving_second: int) -> str: - - icons = { - "Timespinner Wheel": "https://timespinnerwiki.com/mediawiki/images/7/76/Timespinner_Wheel.png", - "Timespinner Spindle": "https://timespinnerwiki.com/mediawiki/images/1/1a/Timespinner_Spindle.png", - "Timespinner Gear 1": "https://timespinnerwiki.com/mediawiki/images/3/3c/Timespinner_Gear_1.png", - "Timespinner Gear 2": "https://timespinnerwiki.com/mediawiki/images/e/e9/Timespinner_Gear_2.png", - "Timespinner Gear 3": "https://timespinnerwiki.com/mediawiki/images/2/22/Timespinner_Gear_3.png", - "Talaria Attachment": "https://timespinnerwiki.com/mediawiki/images/6/61/Talaria_Attachment.png", - "Succubus Hairpin": "https://timespinnerwiki.com/mediawiki/images/4/49/Succubus_Hairpin.png", - "Lightwall": "https://timespinnerwiki.com/mediawiki/images/0/03/Lightwall.png", - "Celestial Sash": "https://timespinnerwiki.com/mediawiki/images/f/f1/Celestial_Sash.png", - "Twin Pyramid Key": "https://timespinnerwiki.com/mediawiki/images/4/49/Twin_Pyramid_Key.png", - "Security Keycard D": "https://timespinnerwiki.com/mediawiki/images/1/1b/Security_Keycard_D.png", - "Security Keycard C": "https://timespinnerwiki.com/mediawiki/images/e/e5/Security_Keycard_C.png", - "Security Keycard B": "https://timespinnerwiki.com/mediawiki/images/f/f6/Security_Keycard_B.png", - "Security Keycard A": "https://timespinnerwiki.com/mediawiki/images/b/b9/Security_Keycard_A.png", - "Library Keycard V": "https://timespinnerwiki.com/mediawiki/images/5/50/Library_Keycard_V.png", - "Tablet": "https://timespinnerwiki.com/mediawiki/images/a/a0/Tablet.png", - "Elevator Keycard": "https://timespinnerwiki.com/mediawiki/images/5/55/Elevator_Keycard.png", - "Oculus Ring": "https://timespinnerwiki.com/mediawiki/images/8/8d/Oculus_Ring.png", - "Water Mask": "https://timespinnerwiki.com/mediawiki/images/0/04/Water_Mask.png", - "Gas Mask": "https://timespinnerwiki.com/mediawiki/images/2/2e/Gas_Mask.png", - "Djinn Inferno": "https://timespinnerwiki.com/mediawiki/images/f/f6/Djinn_Inferno.png", - "Pyro Ring": "https://timespinnerwiki.com/mediawiki/images/2/2c/Pyro_Ring.png", - "Infernal Flames": "https://timespinnerwiki.com/mediawiki/images/1/1f/Infernal_Flames.png", - "Fire Orb": "https://timespinnerwiki.com/mediawiki/images/3/3e/Fire_Orb.png", - "Royal Ring": "https://timespinnerwiki.com/mediawiki/images/f/f3/Royal_Ring.png", - "Plasma Geyser": "https://timespinnerwiki.com/mediawiki/images/1/12/Plasma_Geyser.png", - "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", - } +if "Factorio" in network_data_package["games"]: + def render_Factorio_multiworld_tracker(tracker_data: TrackerData, enabled_trackers: List[str]): + inventories: Dict[TeamPlayer, Dict[int, int]] = { + (team, player): { + tracker_data.item_id_to_name["Factorio"][item_id]: count + for item_id, count in tracker_data.get_player_inventory_counts(team, player).items() + } for team, players in tracker_data.get_team_players().items() for player in players + if tracker_data.get_player_game(team, player) == "Factorio" + } - timespinner_location_ids = { - "Present": [ - 1337000, 1337001, 1337002, 1337003, 1337004, 1337005, 1337006, 1337007, 1337008, 1337009, - 1337010, 1337011, 1337012, 1337013, 1337014, 1337015, 1337016, 1337017, 1337018, 1337019, - 1337020, 1337021, 1337022, 1337023, 1337024, 1337025, 1337026, 1337027, 1337028, 1337029, - 1337030, 1337031, 1337032, 1337033, 1337034, 1337035, 1337036, 1337037, 1337038, 1337039, - 1337040, 1337041, 1337042, 1337043, 1337044, 1337045, 1337046, 1337047, 1337048, 1337049, - 1337050, 1337051, 1337052, 1337053, 1337054, 1337055, 1337056, 1337057, 1337058, 1337059, - 1337060, 1337061, 1337062, 1337063, 1337064, 1337065, 1337066, 1337067, 1337068, 1337069, - 1337070, 1337071, 1337072, 1337073, 1337074, 1337075, 1337076, 1337077, 1337078, 1337079, - 1337080, 1337081, 1337082, 1337083, 1337084, 1337085], - "Past": [ - 1337086, 1337087, 1337088, 1337089, - 1337090, 1337091, 1337092, 1337093, 1337094, 1337095, 1337096, 1337097, 1337098, 1337099, - 1337100, 1337101, 1337102, 1337103, 1337104, 1337105, 1337106, 1337107, 1337108, 1337109, - 1337110, 1337111, 1337112, 1337113, 1337114, 1337115, 1337116, 1337117, 1337118, 1337119, - 1337120, 1337121, 1337122, 1337123, 1337124, 1337125, 1337126, 1337127, 1337128, 1337129, - 1337130, 1337131, 1337132, 1337133, 1337134, 1337135, 1337136, 1337137, 1337138, 1337139, - 1337140, 1337141, 1337142, 1337143, 1337144, 1337145, 1337146, 1337147, 1337148, 1337149, - 1337150, 1337151, 1337152, 1337153, 1337154, 1337155, - 1337171, 1337172, 1337173, 1337174, 1337175], - "Ancient Pyramid": [ - 1337236, - 1337246, 1337247, 1337248, 1337249] - } + return render_template( + "multitracker__Factorio.html", + enabled_trackers=enabled_trackers, + current_tracker="Factorio", + room=tracker_data.room, + room_players=tracker_data.get_team_players(), + locations=tracker_data.get_room_locations(), + locations_complete=tracker_data.get_room_locations_complete(), + total_team_locations=tracker_data.get_team_locations_total_count(), + total_team_locations_complete=tracker_data.get_team_locations_checked_count(), + player_names_with_alias=tracker_data.get_room_long_player_names(), + completed_worlds=tracker_data.get_team_completed_worlds_count(), + games=tracker_data.get_room_games(), + states=tracker_data.get_room_client_statuses(), + hints=tracker_data.get_team_hints(), + activity_timers=tracker_data.get_room_last_activity(), + videos=tracker_data.get_room_videos(), + item_id_to_name=tracker_data.item_id_to_name, + location_id_to_name=tracker_data.location_id_to_name, + inventories=inventories, + ) - if(slot_data["DownloadableItems"]): - timespinner_location_ids["Present"] += [ - 1337156, 1337157, 1337159, - 1337160, 1337161, 1337162, 1337163, 1337164, 1337165, 1337166, 1337167, 1337168, 1337169, - 1337170] - if(slot_data["Cantoran"]): - timespinner_location_ids["Past"].append(1337176) - if(slot_data["LoreChecks"]): - timespinner_location_ids["Present"] += [ - 1337177, 1337178, 1337179, - 1337180, 1337181, 1337182, 1337183, 1337184, 1337185, 1337186, 1337187] - timespinner_location_ids["Past"] += [ - 1337188, 1337189, - 1337190, 1337191, 1337192, 1337193, 1337194, 1337195, 1337196, 1337197, 1337198] - if(slot_data["GyreArchives"]): - timespinner_location_ids["Ancient Pyramid"] += [ - 1337237, 1337238, 1337239, - 1337240, 1337241, 1337242, 1337243, 1337244, 1337245] - - display_data = {} - - # Victory condition - game_state = multisave.get("client_game_state", {}).get((team, player), 0) - display_data['game_finished'] = game_state == 30 - - # Turn location IDs into advancement tab counts - checked_locations = multisave.get("location_checks", {}).get((team, player), set()) - lookup_name = lambda id: lookup_any_location_id_to_name[id] - location_info = {tab_name: {lookup_name(id): (id in checked_locations) for id in tab_locations} - for tab_name, tab_locations in timespinner_location_ids.items()} - checks_done = {tab_name: len([id for id in tab_locations if id in checked_locations]) - for tab_name, tab_locations in timespinner_location_ids.items()} - checks_done['Total'] = len(checked_locations) - checks_in_area = {tab_name: len(tab_locations) for tab_name, tab_locations in timespinner_location_ids.items()} - checks_in_area['Total'] = sum(checks_in_area.values()) - acquired_items = {lookup_any_item_id_to_name[id] for id in inventory if id in lookup_any_item_id_to_name} - options = {k for k, v in slot_data.items() if v} - - return render_template("timespinnerTracker.html", - inventory=inventory, icons=icons, acquired_items=acquired_items, - player=player, team=team, room=room, player_name=playerName, - checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, - options=options, **display_data) - -def __renderSuperMetroidTracker(multisave: Dict[str, Any], room: Room, locations: Dict[int, Dict[int, Tuple[int, int, int]]], - inventory: Counter, team: int, player: int, playerName: str, - seed_checks_in_area: Dict[int, Dict[str, int]], checks_done: Dict[str, int], slot_data: Dict, - saving_second: int) -> str: - - icons = { - "Energy Tank": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/ETank.png", - "Missile": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Missile.png", - "Super Missile": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Super.png", - "Power Bomb": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/PowerBomb.png", - "Bomb": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Bomb.png", - "Charge Beam": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Charge.png", - "Ice Beam": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Ice.png", - "Hi-Jump Boots": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/HiJump.png", - "Speed Booster": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/SpeedBooster.png", - "Wave Beam": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Wave.png", - "Spazer": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Spazer.png", - "Spring Ball": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/SpringBall.png", - "Varia Suit": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Varia.png", - "Plasma Beam": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Plasma.png", - "Grappling Beam": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Grapple.png", - "Morph Ball": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Morph.png", - "Reserve Tank": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Reserve.png", - "Gravity Suit": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Gravity.png", - "X-Ray Scope": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/XRayScope.png", - "Space Jump": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/SpaceJump.png", - "Screw Attack": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/ScrewAttack.png", - "Nothing": "", - "No Energy": "", - "Kraid": "", - "Phantoon": "", - "Draygon": "", - "Ridley": "", - "Mother Brain": "", - } + _multiworld_trackers["Factorio"] = render_Factorio_multiworld_tracker - multi_items = { - "Energy Tank": 83000, - "Missile": 83001, - "Super Missile": 83002, - "Power Bomb": 83003, - "Reserve Tank": 83020, - } +if "A Link to the Past" in network_data_package["games"]: + def render_ALinkToThePast_multiworld_tracker(tracker_data: TrackerData, enabled_trackers: List[str]): + # Helper objects. + alttp_id_lookup = tracker_data.item_name_to_id["A Link to the Past"] - supermetroid_location_ids = { - 'Crateria/Blue Brinstar': [82005, 82007, 82008, 82026, 82029, - 82000, 82004, 82006, 82009, 82010, - 82011, 82012, 82027, 82028, 82034, - 82036, 82037], - 'Green/Pink Brinstar': [82017, 82023, 82030, 82033, 82035, - 82013, 82014, 82015, 82016, 82018, - 82019, 82021, 82022, 82024, 82025, - 82031], - 'Red Brinstar': [82038, 82042, 82039, 82040, 82041], - 'Kraid': [82043, 82048, 82044], - 'Norfair': [82050, 82053, 82061, 82066, 82068, - 82049, 82051, 82054, 82055, 82056, - 82062, 82063, 82064, 82065, 82067], - 'Lower Norfair': [82078, 82079, 82080, 82070, 82071, - 82073, 82074, 82075, 82076, 82077], - 'Crocomire': [82052, 82060, 82057, 82058, 82059], - 'Wrecked Ship': [82129, 82132, 82134, 82135, 82001, - 82002, 82003, 82128, 82130, 82131, - 82133], - 'West Maridia': [82138, 82136, 82137, 82139, 82140, - 82141, 82142], - 'East Maridia': [82143, 82145, 82150, 82152, 82154, - 82144, 82146, 82147, 82148, 82149, - 82151], - } + multi_items = { + alttp_id_lookup[name] + for name in ("Progressive Sword", "Progressive Bow", "Bottle", "Progressive Glove", "Triforce Piece") + } + links = { + "Bow": "Progressive Bow", + "Silver Arrows": "Progressive Bow", + "Silver Bow": "Progressive Bow", + "Progressive Bow (Alt)": "Progressive Bow", + "Bottle (Red Potion)": "Bottle", + "Bottle (Green Potion)": "Bottle", + "Bottle (Blue Potion)": "Bottle", + "Bottle (Fairy)": "Bottle", + "Bottle (Bee)": "Bottle", + "Bottle (Good Bee)": "Bottle", + "Fighter Sword": "Progressive Sword", + "Master Sword": "Progressive Sword", + "Tempered Sword": "Progressive Sword", + "Golden Sword": "Progressive Sword", + "Power Glove": "Progressive Glove", + "Titans Mitts": "Progressive Glove", + } + links = {alttp_id_lookup[key]: alttp_id_lookup[value] for key, value in links.items()} + levels = { + "Fighter Sword": 1, + "Master Sword": 2, + "Tempered Sword": 3, + "Golden Sword": 4, + "Power Glove": 1, + "Titans Mitts": 2, + "Bow": 1, + "Silver Bow": 2, + "Triforce Piece": 90, + } + tracking_names = [ + "Progressive Sword", "Progressive Bow", "Book of Mudora", "Hammer", "Hookshot", "Magic Mirror", "Flute", + "Pegasus Boots", "Progressive Glove", "Flippers", "Moon Pearl", "Blue Boomerang", "Red Boomerang", + "Bug Catching Net", "Cape", "Shovel", "Lamp", "Mushroom", "Magic Powder", "Cane of Somaria", + "Cane of Byrna", "Fire Rod", "Ice Rod", "Bombos", "Ether", "Quake", "Bottle", "Triforce Piece", "Triforce", + ] + default_locations = { + "Light World": { + 1572864, 1572865, 60034, 1572867, 1572868, 60037, 1572869, 1572866, 60040, 59788, 60046, 60175, + 1572880, 60049, 60178, 1572883, 60052, 60181, 1572885, 60055, 60184, 191256, 60058, 60187, 1572884, + 1572886, 1572887, 1572906, 60202, 60205, 59824, 166320, 1010170, 60208, 60211, 60214, 60217, 59836, + 60220, 60223, 59839, 1573184, 60226, 975299, 1573188, 1573189, 188229, 60229, 60232, 1573193, + 1573194, 60235, 1573187, 59845, 59854, 211407, 60238, 59857, 1573185, 1573186, 1572882, 212328, + 59881, 59761, 59890, 59770, 193020, 212605 + }, + "Dark World": { + 59776, 59779, 975237, 1572870, 60043, 1572881, 60190, 60193, 60196, 60199, 60840, 1573190, 209095, + 1573192, 1573191, 60241, 60244, 60247, 60250, 59884, 59887, 60019, 60022, 60028, 60031 + }, + "Desert Palace": {1573216, 59842, 59851, 59791, 1573201, 59830}, + "Eastern Palace": {1573200, 59827, 59893, 59767, 59833, 59773}, + "Hyrule Castle": {60256, 60259, 60169, 60172, 59758, 59764, 60025, 60253}, + "Agahnims Tower": {60082, 60085}, + "Tower of Hera": {1573218, 59878, 59821, 1573202, 59896, 59899}, + "Swamp Palace": {60064, 60067, 60070, 59782, 59785, 60073, 60076, 60079, 1573204, 60061}, + "Thieves Town": {59905, 59908, 59911, 59914, 59917, 59920, 59923, 1573206}, + "Skull Woods": {59809, 59902, 59848, 59794, 1573205, 59800, 59803, 59806}, + "Ice Palace": {59872, 59875, 59812, 59818, 59860, 59797, 1573207, 59869}, + "Misery Mire": {60001, 60004, 60007, 60010, 60013, 1573208, 59866, 59998}, + "Turtle Rock": {59938, 59941, 59944, 1573209, 59947, 59950, 59953, 59956, 59926, 59929, 59932, 59935}, + "Palace of Darkness": { + 59968, 59971, 59974, 59977, 59980, 59983, 59986, 1573203, 59989, 59959, 59992, 59962, 59995, + 59965 + }, + "Ganons Tower": { + 60160, 60163, 60166, 60088, 60091, 60094, 60097, 60100, 60103, 60106, 60109, 60112, 60115, 60118, + 60121, 60124, 60127, 1573217, 60130, 60133, 60136, 60139, 60142, 60145, 60148, 60151, 60157 + }, + "Total": set() + } + key_only_locations = { + "Light World": set(), + "Dark World": set(), + "Desert Palace": {0x140031, 0x14002b, 0x140061, 0x140028}, + "Eastern Palace": {0x14005b, 0x140049}, + "Hyrule Castle": {0x140037, 0x140034, 0x14000d, 0x14003d}, + "Agahnims Tower": {0x140061, 0x140052}, + "Tower of Hera": set(), + "Swamp Palace": {0x140019, 0x140016, 0x140013, 0x140010, 0x14000a}, + "Thieves Town": {0x14005e, 0x14004f}, + "Skull Woods": {0x14002e, 0x14001c}, + "Ice Palace": {0x140004, 0x140022, 0x140025, 0x140046}, + "Misery Mire": {0x140055, 0x14004c, 0x140064}, + "Turtle Rock": {0x140058, 0x140007}, + "Palace of Darkness": set(), + "Ganons Tower": {0x140040, 0x140043, 0x14003a, 0x14001f}, + "Total": set() + } + location_to_area = {} + for area, locations in default_locations.items(): + for location in locations: + location_to_area[location] = area + for area, locations in key_only_locations.items(): + for location in locations: + location_to_area[location] = area + + checks_in_area = {area: len(checks) for area, checks in default_locations.items()} + checks_in_area["Total"] = 216 + ordered_areas = ( + "Light World", "Dark World", "Hyrule Castle", "Agahnims Tower", "Eastern Palace", "Desert Palace", + "Tower of Hera", "Palace of Darkness", "Swamp Palace", "Skull Woods", "Thieves Town", "Ice Palace", + "Misery Mire", "Turtle Rock", "Ganons Tower", "Total" + ) - display_data = {} - - - for item_name, item_id in multi_items.items(): - base_name = item_name.split()[0].lower() - display_data[base_name+"_count"] = inventory[item_id] - - # Victory condition - game_state = multisave.get("client_game_state", {}).get((team, player), 0) - display_data['game_finished'] = game_state == 30 - - # Turn location IDs into advancement tab counts - checked_locations = multisave.get("location_checks", {}).get((team, player), set()) - lookup_name = lambda id: lookup_any_location_id_to_name[id] - location_info = {tab_name: {lookup_name(id): (id in checked_locations) for id in tab_locations} - for tab_name, tab_locations in supermetroid_location_ids.items()} - checks_done = {tab_name: len([id for id in tab_locations if id in checked_locations]) - for tab_name, tab_locations in supermetroid_location_ids.items()} - checks_done['Total'] = len(checked_locations) - checks_in_area = {tab_name: len(tab_locations) for tab_name, tab_locations in supermetroid_location_ids.items()} - checks_in_area['Total'] = sum(checks_in_area.values()) - - return render_template("supermetroidTracker.html", - inventory=inventory, icons=icons, - acquired_items={lookup_any_item_id_to_name[id] for id in inventory if - id in lookup_any_item_id_to_name}, - player=player, team=team, room=room, player_name=playerName, - checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, - **display_data) - -def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict[int, Dict[int, Tuple[int, int, int]]], - inventory: Counter, team: int, player: int, playerName: str, - seed_checks_in_area: Dict[int, Dict[str, int]], checks_done: Dict[str, int], - slot_data: Dict, saving_second: int) -> str: - - SC2WOL_LOC_ID_OFFSET = 1000 - SC2WOL_ITEM_ID_OFFSET = 1000 - - - icons = { - "Starting Minerals": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/icons/icon-mineral-protoss.png", - "Starting Vespene": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/icons/icon-gas-terran.png", - "Starting Supply": "https://static.wikia.nocookie.net/starcraft/images/d/d3/TerranSupply_SC2_Icon1.gif", - - "Infantry Weapons Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel1.png", - "Infantry Weapons Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel2.png", - "Infantry Weapons Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel3.png", - "Infantry Armor Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel1.png", - "Infantry Armor Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel2.png", - "Infantry Armor Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel3.png", - "Vehicle Weapons Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel1.png", - "Vehicle Weapons Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel2.png", - "Vehicle Weapons Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel3.png", - "Vehicle Armor Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel1.png", - "Vehicle Armor Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel2.png", - "Vehicle Armor Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel3.png", - "Ship Weapons Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel1.png", - "Ship Weapons Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel2.png", - "Ship Weapons Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel3.png", - "Ship Armor Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel1.png", - "Ship Armor Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel2.png", - "Ship Armor Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel3.png", - - "Bunker": "https://static.wikia.nocookie.net/starcraft/images/c/c5/Bunker_SC2_Icon1.jpg", - "Missile Turret": "https://static.wikia.nocookie.net/starcraft/images/5/5f/MissileTurret_SC2_Icon1.jpg", - "Sensor Tower": "https://static.wikia.nocookie.net/starcraft/images/d/d2/SensorTower_SC2_Icon1.jpg", - - "Projectile Accelerator (Bunker)": "https://0rganics.org/archipelago/sc2wol/ProjectileAccelerator.png", - "Neosteel Bunker (Bunker)": "https://0rganics.org/archipelago/sc2wol/NeosteelBunker.png", - "Titanium Housing (Missile Turret)": "https://0rganics.org/archipelago/sc2wol/TitaniumHousing.png", - "Hellstorm Batteries (Missile Turret)": "https://0rganics.org/archipelago/sc2wol/HellstormBatteries.png", - "Advanced Construction (SCV)": "https://0rganics.org/archipelago/sc2wol/AdvancedConstruction.png", - "Dual-Fusion Welders (SCV)": "https://0rganics.org/archipelago/sc2wol/Dual-FusionWelders.png", - "Fire-Suppression System (Building)": "https://0rganics.org/archipelago/sc2wol/Fire-SuppressionSystem.png", - "Orbital Command (Building)": "https://0rganics.org/archipelago/sc2wol/OrbitalCommandCampaign.png", - - "Marine": "https://static.wikia.nocookie.net/starcraft/images/4/47/Marine_SC2_Icon1.jpg", - "Medic": "https://static.wikia.nocookie.net/starcraft/images/7/74/Medic_SC2_Rend1.jpg", - "Firebat": "https://static.wikia.nocookie.net/starcraft/images/3/3c/Firebat_SC2_Rend1.jpg", - "Marauder": "https://static.wikia.nocookie.net/starcraft/images/b/ba/Marauder_SC2_Icon1.jpg", - "Reaper": "https://static.wikia.nocookie.net/starcraft/images/7/7d/Reaper_SC2_Icon1.jpg", - - "Stimpack (Marine)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", - "Super Stimpack (Marine)": "/static/static/icons/sc2/superstimpack.png", - "Combat Shield (Marine)": "https://0rganics.org/archipelago/sc2wol/CombatShieldCampaign.png", - "Laser Targeting System (Marine)": "/static/static/icons/sc2/lasertargetingsystem.png", - "Magrail Munitions (Marine)": "/static/static/icons/sc2/magrailmunitions.png", - "Optimized Logistics (Marine)": "/static/static/icons/sc2/optimizedlogistics.png", - "Advanced Medic Facilities (Medic)": "https://0rganics.org/archipelago/sc2wol/AdvancedMedicFacilities.png", - "Stabilizer Medpacks (Medic)": "https://0rganics.org/archipelago/sc2wol/StabilizerMedpacks.png", - "Restoration (Medic)": "/static/static/icons/sc2/restoration.png", - "Optical Flare (Medic)": "/static/static/icons/sc2/opticalflare.png", - "Optimized Logistics (Medic)": "/static/static/icons/sc2/optimizedlogistics.png", - "Incinerator Gauntlets (Firebat)": "https://0rganics.org/archipelago/sc2wol/IncineratorGauntlets.png", - "Juggernaut Plating (Firebat)": "https://0rganics.org/archipelago/sc2wol/JuggernautPlating.png", - "Stimpack (Firebat)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", - "Super Stimpack (Firebat)": "/static/static/icons/sc2/superstimpack.png", - "Optimized Logistics (Firebat)": "/static/static/icons/sc2/optimizedlogistics.png", - "Concussive Shells (Marauder)": "https://0rganics.org/archipelago/sc2wol/ConcussiveShellsCampaign.png", - "Kinetic Foam (Marauder)": "https://0rganics.org/archipelago/sc2wol/KineticFoam.png", - "Stimpack (Marauder)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", - "Super Stimpack (Marauder)": "/static/static/icons/sc2/superstimpack.png", - "Laser Targeting System (Marauder)": "/static/static/icons/sc2/lasertargetingsystem.png", - "Magrail Munitions (Marauder)": "/static/static/icons/sc2/magrailmunitions.png", - "Internal Tech Module (Marauder)": "/static/static/icons/sc2/internalizedtechmodule.png", - "U-238 Rounds (Reaper)": "https://0rganics.org/archipelago/sc2wol/U-238Rounds.png", - "G-4 Clusterbomb (Reaper)": "https://0rganics.org/archipelago/sc2wol/G-4Clusterbomb.png", - "Stimpack (Reaper)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", - "Super Stimpack (Reaper)": "/static/static/icons/sc2/superstimpack.png", - "Laser Targeting System (Reaper)": "/static/static/icons/sc2/lasertargetingsystem.png", - "Advanced Cloaking Field (Reaper)": "/static/static/icons/sc2/terran-cloak-color.png", - "Spider Mines (Reaper)": "/static/static/icons/sc2/spidermine.png", - "Combat Drugs (Reaper)": "/static/static/icons/sc2/reapercombatdrugs.png", - - "Hellion": "https://static.wikia.nocookie.net/starcraft/images/5/56/Hellion_SC2_Icon1.jpg", - "Vulture": "https://static.wikia.nocookie.net/starcraft/images/d/da/Vulture_WoL.jpg", - "Goliath": "https://static.wikia.nocookie.net/starcraft/images/e/eb/Goliath_WoL.jpg", - "Diamondback": "https://static.wikia.nocookie.net/starcraft/images/a/a6/Diamondback_WoL.jpg", - "Siege Tank": "https://static.wikia.nocookie.net/starcraft/images/5/57/SiegeTank_SC2_Icon1.jpg", - - "Twin-Linked Flamethrower (Hellion)": "https://0rganics.org/archipelago/sc2wol/Twin-LinkedFlamethrower.png", - "Thermite Filaments (Hellion)": "https://0rganics.org/archipelago/sc2wol/ThermiteFilaments.png", - "Hellbat Aspect (Hellion)": "/static/static/icons/sc2/hellionbattlemode.png", - "Smart Servos (Hellion)": "/static/static/icons/sc2/transformationservos.png", - "Optimized Logistics (Hellion)": "/static/static/icons/sc2/optimizedlogistics.png", - "Jump Jets (Hellion)": "/static/static/icons/sc2/jumpjets.png", - "Stimpack (Hellion)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", - "Super Stimpack (Hellion)": "/static/static/icons/sc2/superstimpack.png", - "Cerberus Mine (Spider Mine)": "https://0rganics.org/archipelago/sc2wol/CerberusMine.png", - "High Explosive Munition (Spider Mine)": "/static/static/icons/sc2/high-explosive-spidermine.png", - "Replenishable Magazine (Vulture)": "https://0rganics.org/archipelago/sc2wol/ReplenishableMagazine.png", - "Ion Thrusters (Vulture)": "/static/static/icons/sc2/emergencythrusters.png", - "Auto Launchers (Vulture)": "/static/static/icons/sc2/jotunboosters.png", - "Multi-Lock Weapons System (Goliath)": "https://0rganics.org/archipelago/sc2wol/Multi-LockWeaponsSystem.png", - "Ares-Class Targeting System (Goliath)": "https://0rganics.org/archipelago/sc2wol/Ares-ClassTargetingSystem.png", - "Jump Jets (Goliath)": "/static/static/icons/sc2/jumpjets.png", - "Optimized Logistics (Goliath)": "/static/static/icons/sc2/optimizedlogistics.png", - "Tri-Lithium Power Cell (Diamondback)": "https://0rganics.org/archipelago/sc2wol/Tri-LithiumPowerCell.png", - "Shaped Hull (Diamondback)": "https://0rganics.org/archipelago/sc2wol/ShapedHull.png", - "Hyperfluxor (Diamondback)": "/static/static/icons/sc2/hyperfluxor.png", - "Burst Capacitors (Diamondback)": "/static/static/icons/sc2/burstcapacitors.png", - "Optimized Logistics (Diamondback)": "/static/static/icons/sc2/optimizedlogistics.png", - "Maelstrom Rounds (Siege Tank)": "https://0rganics.org/archipelago/sc2wol/MaelstromRounds.png", - "Shaped Blast (Siege Tank)": "https://0rganics.org/archipelago/sc2wol/ShapedBlast.png", - "Jump Jets (Siege Tank)": "/static/static/icons/sc2/jumpjets.png", - "Spider Mines (Siege Tank)": "/static/static/icons/sc2/siegetank-spidermines.png", - "Smart Servos (Siege Tank)": "/static/static/icons/sc2/transformationservos.png", - "Graduating Range (Siege Tank)": "/static/static/icons/sc2/siegetankrange.png", - "Laser Targeting System (Siege Tank)": "/static/static/icons/sc2/lasertargetingsystem.png", - "Advanced Siege Tech (Siege Tank)": "/static/static/icons/sc2/improvedsiegemode.png", - "Internal Tech Module (Siege Tank)": "/static/static/icons/sc2/internalizedtechmodule.png", - - "Medivac": "https://static.wikia.nocookie.net/starcraft/images/d/db/Medivac_SC2_Icon1.jpg", - "Wraith": "https://static.wikia.nocookie.net/starcraft/images/7/75/Wraith_WoL.jpg", - "Viking": "https://static.wikia.nocookie.net/starcraft/images/2/2a/Viking_SC2_Icon1.jpg", - "Banshee": "https://static.wikia.nocookie.net/starcraft/images/3/32/Banshee_SC2_Icon1.jpg", - "Battlecruiser": "https://static.wikia.nocookie.net/starcraft/images/f/f5/Battlecruiser_SC2_Icon1.jpg", - - "Rapid Deployment Tube (Medivac)": "https://0rganics.org/archipelago/sc2wol/RapidDeploymentTube.png", - "Advanced Healing AI (Medivac)": "https://0rganics.org/archipelago/sc2wol/AdvancedHealingAI.png", - "Expanded Hull (Medivac)": "/static/static/icons/sc2/neosteelfortifiedarmor.png", - "Afterburners (Medivac)": "/static/static/icons/sc2/medivacemergencythrusters.png", - "Tomahawk Power Cells (Wraith)": "https://0rganics.org/archipelago/sc2wol/TomahawkPowerCells.png", - "Displacement Field (Wraith)": "https://0rganics.org/archipelago/sc2wol/DisplacementField.png", - "Advanced Laser Technology (Wraith)": "/static/static/icons/sc2/improvedburstlaser.png", - "Ripwave Missiles (Viking)": "https://0rganics.org/archipelago/sc2wol/RipwaveMissiles.png", - "Phobos-Class Weapons System (Viking)": "https://0rganics.org/archipelago/sc2wol/Phobos-ClassWeaponsSystem.png", - "Smart Servos (Viking)": "/static/static/icons/sc2/transformationservos.png", - "Magrail Munitions (Viking)": "/static/static/icons/sc2/magrailmunitions.png", - "Cross-Spectrum Dampeners (Banshee)": "/static/static/icons/sc2/crossspectrumdampeners.png", - "Advanced Cross-Spectrum Dampeners (Banshee)": "https://0rganics.org/archipelago/sc2wol/Cross-SpectrumDampeners.png", - "Shockwave Missile Battery (Banshee)": "https://0rganics.org/archipelago/sc2wol/ShockwaveMissileBattery.png", - "Hyperflight Rotors (Banshee)": "/static/static/icons/sc2/hyperflightrotors.png", - "Laser Targeting System (Banshee)": "/static/static/icons/sc2/lasertargetingsystem.png", - "Internal Tech Module (Banshee)": "/static/static/icons/sc2/internalizedtechmodule.png", - "Missile Pods (Battlecruiser)": "https://0rganics.org/archipelago/sc2wol/MissilePods.png", - "Defensive Matrix (Battlecruiser)": "https://0rganics.org/archipelago/sc2wol/DefensiveMatrix.png", - "Tactical Jump (Battlecruiser)": "/static/static/icons/sc2/warpjump.png", - "Cloak (Battlecruiser)": "/static/static/icons/sc2/terran-cloak-color.png", - "ATX Laser Battery (Battlecruiser)": "/static/static/icons/sc2/specialordance.png", - "Optimized Logistics (Battlecruiser)": "/static/static/icons/sc2/optimizedlogistics.png", - "Internal Tech Module (Battlecruiser)": "/static/static/icons/sc2/internalizedtechmodule.png", - - "Ghost": "https://static.wikia.nocookie.net/starcraft/images/6/6e/Ghost_SC2_Icon1.jpg", - "Spectre": "https://static.wikia.nocookie.net/starcraft/images/0/0d/Spectre_WoL.jpg", - "Thor": "https://static.wikia.nocookie.net/starcraft/images/e/ef/Thor_SC2_Icon1.jpg", - - "Widow Mine": "/static/static/icons/sc2/widowmine.png", - "Cyclone": "/static/static/icons/sc2/cyclone.png", - "Liberator": "/static/static/icons/sc2/liberator.png", - "Valkyrie": "/static/static/icons/sc2/valkyrie.png", - - "Ocular Implants (Ghost)": "https://0rganics.org/archipelago/sc2wol/OcularImplants.png", - "Crius Suit (Ghost)": "https://0rganics.org/archipelago/sc2wol/CriusSuit.png", - "EMP Rounds (Ghost)": "/static/static/icons/sc2/terran-emp-color.png", - "Lockdown (Ghost)": "/static/static/icons/sc2/lockdown.png", - "Psionic Lash (Spectre)": "https://0rganics.org/archipelago/sc2wol/PsionicLash.png", - "Nyx-Class Cloaking Module (Spectre)": "https://0rganics.org/archipelago/sc2wol/Nyx-ClassCloakingModule.png", - "Impaler Rounds (Spectre)": "/static/static/icons/sc2/impalerrounds.png", - "330mm Barrage Cannon (Thor)": "https://0rganics.org/archipelago/sc2wol/330mmBarrageCannon.png", - "Immortality Protocol (Thor)": "https://0rganics.org/archipelago/sc2wol/ImmortalityProtocol.png", - "High Impact Payload (Thor)": "/static/static/icons/sc2/thorsiegemode.png", - "Smart Servos (Thor)": "/static/static/icons/sc2/transformationservos.png", - - "Optimized Logistics (Predator)": "/static/static/icons/sc2/optimizedlogistics.png", - "Drilling Claws (Widow Mine)": "/static/static/icons/sc2/drillingclaws.png", - "Concealment (Widow Mine)": "/static/static/icons/sc2/widowminehidden.png", - "Black Market Launchers (Widow Mine)": "/static/static/icons/sc2/widowmine-attackrange.png", - "Executioner Missiles (Widow Mine)": "/static/static/icons/sc2/widowmine-deathblossom.png", - "Mag-Field Accelerators (Cyclone)": "/static/static/icons/sc2/magfieldaccelerator.png", - "Mag-Field Launchers (Cyclone)": "/static/static/icons/sc2/cyclonerangeupgrade.png", - "Targeting Optics (Cyclone)": "/static/static/icons/sc2/targetingoptics.png", - "Rapid Fire Launchers (Cyclone)": "/static/static/icons/sc2/ripwavemissiles.png", - "Bio Mechanical Repair Drone (Raven)": "/static/static/icons/sc2/biomechanicaldrone.png", - "Spider Mines (Raven)": "/static/static/icons/sc2/siegetank-spidermines.png", - "Railgun Turret (Raven)": "/static/static/icons/sc2/autoturretblackops.png", - "Hunter-Seeker Weapon (Raven)": "/static/static/icons/sc2/specialordance.png", - "Interference Matrix (Raven)": "/static/static/icons/sc2/interferencematrix.png", - "Anti-Armor Missile (Raven)": "/static/static/icons/sc2/shreddermissile.png", - "Internal Tech Module (Raven)": "/static/static/icons/sc2/internalizedtechmodule.png", - "EMP Shockwave (Science Vessel)": "/static/static/icons/sc2/staticempblast.png", - "Defensive Matrix (Science Vessel)": "https://0rganics.org/archipelago/sc2wol/DefensiveMatrix.png", - "Advanced Ballistics (Liberator)": "/static/static/icons/sc2/advanceballistics.png", - "Raid Artillery (Liberator)": "/static/static/icons/sc2/terrandefendermodestructureattack.png", - "Cloak (Liberator)": "/static/static/icons/sc2/terran-cloak-color.png", - "Laser Targeting System (Liberator)": "/static/static/icons/sc2/lasertargetingsystem.png", - "Optimized Logistics (Liberator)": "/static/static/icons/sc2/optimizedlogistics.png", - "Enhanced Cluster Launchers (Valkyrie)": "https://0rganics.org/archipelago/sc2wol/HellstormBatteries.png", - "Shaped Hull (Valkyrie)": "https://0rganics.org/archipelago/sc2wol/ShapedHull.png", - "Burst Lasers (Valkyrie)": "/static/static/icons/sc2/improvedburstlaser.png", - "Afterburners (Valkyrie)": "/static/static/icons/sc2/medivacemergencythrusters.png", - - "War Pigs": "https://static.wikia.nocookie.net/starcraft/images/e/ed/WarPigs_SC2_Icon1.jpg", - "Devil Dogs": "https://static.wikia.nocookie.net/starcraft/images/3/33/DevilDogs_SC2_Icon1.jpg", - "Hammer Securities": "https://static.wikia.nocookie.net/starcraft/images/3/3b/HammerSecurity_SC2_Icon1.jpg", - "Spartan Company": "https://static.wikia.nocookie.net/starcraft/images/b/be/SpartanCompany_SC2_Icon1.jpg", - "Siege Breakers": "https://static.wikia.nocookie.net/starcraft/images/3/31/SiegeBreakers_SC2_Icon1.jpg", - "Hel's Angel": "https://static.wikia.nocookie.net/starcraft/images/6/63/HelsAngels_SC2_Icon1.jpg", - "Dusk Wings": "https://static.wikia.nocookie.net/starcraft/images/5/52/DuskWings_SC2_Icon1.jpg", - "Jackson's Revenge": "https://static.wikia.nocookie.net/starcraft/images/9/95/JacksonsRevenge_SC2_Icon1.jpg", - - "Ultra-Capacitors": "https://static.wikia.nocookie.net/starcraft/images/2/23/SC2_Lab_Ultra_Capacitors_Icon.png", - "Vanadium Plating": "https://static.wikia.nocookie.net/starcraft/images/6/67/SC2_Lab_VanPlating_Icon.png", - "Orbital Depots": "https://static.wikia.nocookie.net/starcraft/images/0/01/SC2_Lab_Orbital_Depot_Icon.png", - "Micro-Filtering": "https://static.wikia.nocookie.net/starcraft/images/2/20/SC2_Lab_MicroFilter_Icon.png", - "Automated Refinery": "https://static.wikia.nocookie.net/starcraft/images/7/71/SC2_Lab_Auto_Refinery_Icon.png", - "Command Center Reactor": "https://static.wikia.nocookie.net/starcraft/images/e/ef/SC2_Lab_CC_Reactor_Icon.png", - "Raven": "https://static.wikia.nocookie.net/starcraft/images/1/19/SC2_Lab_Raven_Icon.png", - "Science Vessel": "https://static.wikia.nocookie.net/starcraft/images/c/c3/SC2_Lab_SciVes_Icon.png", - "Tech Reactor": "https://static.wikia.nocookie.net/starcraft/images/c/c5/SC2_Lab_Tech_Reactor_Icon.png", - "Orbital Strike": "https://static.wikia.nocookie.net/starcraft/images/d/df/SC2_Lab_Orb_Strike_Icon.png", - - "Shrike Turret (Bunker)": "https://static.wikia.nocookie.net/starcraft/images/4/44/SC2_Lab_Shrike_Turret_Icon.png", - "Fortified Bunker (Bunker)": "https://static.wikia.nocookie.net/starcraft/images/4/4f/SC2_Lab_FortBunker_Icon.png", - "Planetary Fortress": "https://static.wikia.nocookie.net/starcraft/images/0/0b/SC2_Lab_PlanetFortress_Icon.png", - "Perdition Turret": "https://static.wikia.nocookie.net/starcraft/images/a/af/SC2_Lab_PerdTurret_Icon.png", - "Predator": "https://static.wikia.nocookie.net/starcraft/images/8/83/SC2_Lab_Predator_Icon.png", - "Hercules": "https://static.wikia.nocookie.net/starcraft/images/4/40/SC2_Lab_Hercules_Icon.png", - "Cellular Reactor": "https://static.wikia.nocookie.net/starcraft/images/d/d8/SC2_Lab_CellReactor_Icon.png", - "Regenerative Bio-Steel Level 1": "/static/static/icons/sc2/SC2_Lab_BioSteel_L1.png", - "Regenerative Bio-Steel Level 2": "/static/static/icons/sc2/SC2_Lab_BioSteel_L2.png", - "Hive Mind Emulator": "https://static.wikia.nocookie.net/starcraft/images/b/bc/SC2_Lab_Hive_Emulator_Icon.png", - "Psi Disrupter": "https://static.wikia.nocookie.net/starcraft/images/c/cf/SC2_Lab_Psi_Disruptor_Icon.png", - - "Zealot": "https://static.wikia.nocookie.net/starcraft/images/6/6e/Icon_Protoss_Zealot.jpg", - "Stalker": "https://static.wikia.nocookie.net/starcraft/images/0/0d/Icon_Protoss_Stalker.jpg", - "High Templar": "https://static.wikia.nocookie.net/starcraft/images/a/a0/Icon_Protoss_High_Templar.jpg", - "Dark Templar": "https://static.wikia.nocookie.net/starcraft/images/9/90/Icon_Protoss_Dark_Templar.jpg", - "Immortal": "https://static.wikia.nocookie.net/starcraft/images/c/c1/Icon_Protoss_Immortal.jpg", - "Colossus": "https://static.wikia.nocookie.net/starcraft/images/4/40/Icon_Protoss_Colossus.jpg", - "Phoenix": "https://static.wikia.nocookie.net/starcraft/images/b/b1/Icon_Protoss_Phoenix.jpg", - "Void Ray": "https://static.wikia.nocookie.net/starcraft/images/1/1d/VoidRay_SC2_Rend1.jpg", - "Carrier": "https://static.wikia.nocookie.net/starcraft/images/2/2c/Icon_Protoss_Carrier.jpg", - - "Nothing": "", - } - sc2wol_location_ids = { - "Liberation Day": range(SC2WOL_LOC_ID_OFFSET + 100, SC2WOL_LOC_ID_OFFSET + 200), - "The Outlaws": range(SC2WOL_LOC_ID_OFFSET + 200, SC2WOL_LOC_ID_OFFSET + 300), - "Zero Hour": range(SC2WOL_LOC_ID_OFFSET + 300, SC2WOL_LOC_ID_OFFSET + 400), - "Evacuation": range(SC2WOL_LOC_ID_OFFSET + 400, SC2WOL_LOC_ID_OFFSET + 500), - "Outbreak": range(SC2WOL_LOC_ID_OFFSET + 500, SC2WOL_LOC_ID_OFFSET + 600), - "Safe Haven": range(SC2WOL_LOC_ID_OFFSET + 600, SC2WOL_LOC_ID_OFFSET + 700), - "Haven's Fall": range(SC2WOL_LOC_ID_OFFSET + 700, SC2WOL_LOC_ID_OFFSET + 800), - "Smash and Grab": range(SC2WOL_LOC_ID_OFFSET + 800, SC2WOL_LOC_ID_OFFSET + 900), - "The Dig": range(SC2WOL_LOC_ID_OFFSET + 900, SC2WOL_LOC_ID_OFFSET + 1000), - "The Moebius Factor": range(SC2WOL_LOC_ID_OFFSET + 1000, SC2WOL_LOC_ID_OFFSET + 1100), - "Supernova": range(SC2WOL_LOC_ID_OFFSET + 1100, SC2WOL_LOC_ID_OFFSET + 1200), - "Maw of the Void": range(SC2WOL_LOC_ID_OFFSET + 1200, SC2WOL_LOC_ID_OFFSET + 1300), - "Devil's Playground": range(SC2WOL_LOC_ID_OFFSET + 1300, SC2WOL_LOC_ID_OFFSET + 1400), - "Welcome to the Jungle": range(SC2WOL_LOC_ID_OFFSET + 1400, SC2WOL_LOC_ID_OFFSET + 1500), - "Breakout": range(SC2WOL_LOC_ID_OFFSET + 1500, SC2WOL_LOC_ID_OFFSET + 1600), - "Ghost of a Chance": range(SC2WOL_LOC_ID_OFFSET + 1600, SC2WOL_LOC_ID_OFFSET + 1700), - "The Great Train Robbery": range(SC2WOL_LOC_ID_OFFSET + 1700, SC2WOL_LOC_ID_OFFSET + 1800), - "Cutthroat": range(SC2WOL_LOC_ID_OFFSET + 1800, SC2WOL_LOC_ID_OFFSET + 1900), - "Engine of Destruction": range(SC2WOL_LOC_ID_OFFSET + 1900, SC2WOL_LOC_ID_OFFSET + 2000), - "Media Blitz": range(SC2WOL_LOC_ID_OFFSET + 2000, SC2WOL_LOC_ID_OFFSET + 2100), - "Piercing the Shroud": range(SC2WOL_LOC_ID_OFFSET + 2100, SC2WOL_LOC_ID_OFFSET + 2200), - "Whispers of Doom": range(SC2WOL_LOC_ID_OFFSET + 2200, SC2WOL_LOC_ID_OFFSET + 2300), - "A Sinister Turn": range(SC2WOL_LOC_ID_OFFSET + 2300, SC2WOL_LOC_ID_OFFSET + 2400), - "Echoes of the Future": range(SC2WOL_LOC_ID_OFFSET + 2400, SC2WOL_LOC_ID_OFFSET + 2500), - "In Utter Darkness": range(SC2WOL_LOC_ID_OFFSET + 2500, SC2WOL_LOC_ID_OFFSET + 2600), - "Gates of Hell": range(SC2WOL_LOC_ID_OFFSET + 2600, SC2WOL_LOC_ID_OFFSET + 2700), - "Belly of the Beast": range(SC2WOL_LOC_ID_OFFSET + 2700, SC2WOL_LOC_ID_OFFSET + 2800), - "Shatter the Sky": range(SC2WOL_LOC_ID_OFFSET + 2800, SC2WOL_LOC_ID_OFFSET + 2900), - } + player_checks_in_area = { + (team, player): { + area_name: len(tracker_data._multidata["checks_in_area"][player][area_name]) + if area_name != "Total" else tracker_data._multidata["checks_in_area"][player]["Total"] + for area_name in ordered_areas + } + for team, players in tracker_data.get_team_players().items() + for player in players + if tracker_data.get_slot_info(team, player).type != SlotType.group and + tracker_data.get_slot_info(team, player).game == "A Link to the Past" + } - display_data = {} + tracking_ids = [] + for item in tracking_names: + tracking_ids.append(alttp_id_lookup[item]) + + # Can't wait to get this into the apworld. Oof. + from worlds.alttp import Items + + small_key_ids = {} + big_key_ids = {} + ids_small_key = {} + ids_big_key = {} + for item_name, data in Items.item_table.items(): + if "Key" in item_name: + area = item_name.split("(")[1][:-1] + if "Small" in item_name: + small_key_ids[area] = data[2] + ids_small_key[data[2]] = area + else: + big_key_ids[area] = data[2] + ids_big_key[data[2]] = area - # Grouped Items - grouped_item_ids = { - "Progressive Weapon Upgrade": 107 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Armor Upgrade": 108 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Infantry Upgrade": 109 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Vehicle Upgrade": 110 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Ship Upgrade": 111 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Weapon/Armor Upgrade": 112 + SC2WOL_ITEM_ID_OFFSET - } - grouped_item_replacements = { - "Progressive Weapon Upgrade": ["Progressive Infantry Weapon", "Progressive Vehicle Weapon", "Progressive Ship Weapon"], - "Progressive Armor Upgrade": ["Progressive Infantry Armor", "Progressive Vehicle Armor", "Progressive Ship Armor"], - "Progressive Infantry Upgrade": ["Progressive Infantry Weapon", "Progressive Infantry Armor"], - "Progressive Vehicle Upgrade": ["Progressive Vehicle Weapon", "Progressive Vehicle Armor"], - "Progressive Ship Upgrade": ["Progressive Ship Weapon", "Progressive Ship Armor"] - } - grouped_item_replacements["Progressive Weapon/Armor Upgrade"] = grouped_item_replacements["Progressive Weapon Upgrade"] + grouped_item_replacements["Progressive Armor Upgrade"] - replacement_item_ids = { - "Progressive Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Infantry Armor": 102 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET, - } - for grouped_item_name, grouped_item_id in grouped_item_ids.items(): - count: int = inventory[grouped_item_id] - if count > 0: - for replacement_item in grouped_item_replacements[grouped_item_name]: - replacement_id: int = replacement_item_ids[replacement_item] - inventory[replacement_id] = count - - # Determine display for progressive items - progressive_items = { - "Progressive Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Infantry Armor": 102 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stimpack (Marine)": 208 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stimpack (Firebat)": 226 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stimpack (Marauder)": 228 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stimpack (Reaper)": 250 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stimpack (Hellion)": 259 + SC2WOL_ITEM_ID_OFFSET, - "Progressive High Impact Payload (Thor)": 361 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Cross-Spectrum Dampeners (Banshee)": 316 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Regenerative Bio-Steel": 617 + SC2WOL_ITEM_ID_OFFSET - } - progressive_names = { - "Progressive Infantry Weapon": ["Infantry Weapons Level 1", "Infantry Weapons Level 1", "Infantry Weapons Level 2", "Infantry Weapons Level 3"], - "Progressive Infantry Armor": ["Infantry Armor Level 1", "Infantry Armor Level 1", "Infantry Armor Level 2", "Infantry Armor Level 3"], - "Progressive Vehicle Weapon": ["Vehicle Weapons Level 1", "Vehicle Weapons Level 1", "Vehicle Weapons Level 2", "Vehicle Weapons Level 3"], - "Progressive Vehicle Armor": ["Vehicle Armor Level 1", "Vehicle Armor Level 1", "Vehicle Armor Level 2", "Vehicle Armor Level 3"], - "Progressive Ship Weapon": ["Ship Weapons Level 1", "Ship Weapons Level 1", "Ship Weapons Level 2", "Ship Weapons Level 3"], - "Progressive Ship Armor": ["Ship Armor Level 1", "Ship Armor Level 1", "Ship Armor Level 2", "Ship Armor Level 3"], - "Progressive Stimpack (Marine)": ["Stimpack (Marine)", "Stimpack (Marine)", "Super Stimpack (Marine)"], - "Progressive Stimpack (Firebat)": ["Stimpack (Firebat)", "Stimpack (Firebat)", "Super Stimpack (Firebat)"], - "Progressive Stimpack (Marauder)": ["Stimpack (Marauder)", "Stimpack (Marauder)", "Super Stimpack (Marauder)"], - "Progressive Stimpack (Reaper)": ["Stimpack (Reaper)", "Stimpack (Reaper)", "Super Stimpack (Reaper)"], - "Progressive Stimpack (Hellion)": ["Stimpack (Hellion)", "Stimpack (Hellion)", "Super Stimpack (Hellion)"], - "Progressive High Impact Payload (Thor)": ["High Impact Payload (Thor)", "High Impact Payload (Thor)", "Smart Servos (Thor)"], - "Progressive Cross-Spectrum Dampeners (Banshee)": ["Cross-Spectrum Dampeners (Banshee)", "Cross-Spectrum Dampeners (Banshee)", "Advanced Cross-Spectrum Dampeners (Banshee)"], - "Progressive Regenerative Bio-Steel": ["Regenerative Bio-Steel Level 1", "Regenerative Bio-Steel Level 1", "Regenerative Bio-Steel Level 2"] - } - for item_name, item_id in progressive_items.items(): - level = min(inventory[item_id], len(progressive_names[item_name]) - 1) - display_name = progressive_names[item_name][level] - base_name = (item_name.split(maxsplit=1)[1].lower() - .replace(' ', '_') - .replace("-", "") - .replace("(", "") - .replace(")", "")) - display_data[base_name + "_level"] = level - display_data[base_name + "_url"] = icons[display_name] - display_data[base_name + "_name"] = display_name - - # Multi-items - multi_items = { - "+15 Starting Minerals": 800 + SC2WOL_ITEM_ID_OFFSET, - "+15 Starting Vespene": 801 + SC2WOL_ITEM_ID_OFFSET, - "+2 Starting Supply": 802 + SC2WOL_ITEM_ID_OFFSET - } - for item_name, item_id in multi_items.items(): - base_name = item_name.split()[-1].lower() - count = inventory[item_id] - if base_name == "supply": - count = count * 2 - display_data[base_name + "_count"] = count - else: - count = count * 15 - display_data[base_name + "_count"] = count + def _get_location_table(checks_table: dict) -> dict: + loc_to_area = {} + for area, locations in checks_table.items(): + if area == "Total": + continue + for location in locations: + loc_to_area[location] = area + return loc_to_area + + player_location_to_area = { + (team, player): _get_location_table(tracker_data._multidata["checks_in_area"][player]) + for team, players in tracker_data.get_team_players().items() + for player in players + if tracker_data.get_slot_info(team, player).type != SlotType.group and + tracker_data.get_slot_info(team, player).game == "A Link to the Past" + } - # Victory condition - game_state = multisave.get("client_game_state", {}).get((team, player), 0) - display_data['game_finished'] = game_state == 30 - - # Turn location IDs into mission objective counts - checked_locations = multisave.get("location_checks", {}).get((team, player), set()) - lookup_name = lambda id: lookup_any_location_id_to_name[id] - location_info = {mission_name: {lookup_name(id): (id in checked_locations) for id in mission_locations if id in set(locations[player])} for mission_name, mission_locations in sc2wol_location_ids.items()} - checks_done = {mission_name: len([id for id in mission_locations if id in checked_locations and id in set(locations[player])]) for mission_name, mission_locations in sc2wol_location_ids.items()} - checks_done['Total'] = len(checked_locations) - checks_in_area = {mission_name: len([id for id in mission_locations if id in set(locations[player])]) for mission_name, mission_locations in sc2wol_location_ids.items()} - checks_in_area['Total'] = sum(checks_in_area.values()) - - return render_template("sc2wolTracker.html", - inventory=inventory, icons=icons, - acquired_items={lookup_any_item_id_to_name[id] for id in inventory if - id in lookup_any_item_id_to_name}, - player=player, team=team, room=room, player_name=playerName, - checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, - **display_data) - -def __renderChecksfinder(multisave: Dict[str, Any], room: Room, locations: Dict[int, Dict[int, Tuple[int, int, int]]], - inventory: Counter, team: int, player: int, playerName: str, - seed_checks_in_area: Dict[int, Dict[str, int]], checks_done: Dict[str, int], slot_data: Dict, saving_second: int) -> str: - - icons = { - "Checks Available": "https://0rganics.org/archipelago/cf/spr_tiles_3.png", - "Map Width": "https://0rganics.org/archipelago/cf/spr_tiles_4.png", - "Map Height": "https://0rganics.org/archipelago/cf/spr_tiles_5.png", - "Map Bombs": "https://0rganics.org/archipelago/cf/spr_tiles_6.png", - - "Nothing": "", - } + checks_done: Dict[TeamPlayer, Dict[str: int]] = { + (team, player): {location_name: 0 for location_name in default_locations} + for team, players in tracker_data.get_team_players().items() + for player in players + if tracker_data.get_slot_info(team, player).type != SlotType.group and + tracker_data.get_slot_info(team, player).game == "A Link to the Past" + } - checksfinder_location_ids = { - "Tile 1": 81000, - "Tile 2": 81001, - "Tile 3": 81002, - "Tile 4": 81003, - "Tile 5": 81004, - "Tile 6": 81005, - "Tile 7": 81006, - "Tile 8": 81007, - "Tile 9": 81008, - "Tile 10": 81009, - "Tile 11": 81010, - "Tile 12": 81011, - "Tile 13": 81012, - "Tile 14": 81013, - "Tile 15": 81014, - "Tile 16": 81015, - "Tile 17": 81016, - "Tile 18": 81017, - "Tile 19": 81018, - "Tile 20": 81019, - "Tile 21": 81020, - "Tile 22": 81021, - "Tile 23": 81022, - "Tile 24": 81023, - "Tile 25": 81024, - } + inventories: Dict[TeamPlayer, Dict[int, int]] = {} + player_big_key_locations = {(player): set() for player in tracker_data.get_team_players()[0]} + player_small_key_locations = {player: set() for player in tracker_data.get_team_players()[0]} + group_big_key_locations = set() + group_key_locations = set() + + for (team, player), locations in checks_done.items(): + # Check if game complete. + if tracker_data.get_player_client_status(team, player) == ClientStatus.CLIENT_GOAL: + inventories[team, player][106] = 1 # Triforce + + # Count number of locations checked. + for location in tracker_data.get_player_checked_locations(team, player): + checks_done[team, player][player_location_to_area[team, player][location]] += 1 + checks_done[team, player]["Total"] += 1 + + # Count keys. + for location, (item, receiving, _) in tracker_data.get_player_locations(team, player).items(): + if item in ids_big_key: + player_big_key_locations[receiving].add(ids_big_key[item]) + elif item in ids_small_key: + player_small_key_locations[receiving].add(ids_small_key[item]) + + # Iterate over received items and build inventory/key counts. + inventories[team, player] = collections.Counter() + for network_item in tracker_data.get_player_received_items(team, player): + target_item = links.get(network_item.item, network_item.item) + if network_item.item in levels: # non-progressive + inventories[team, player][target_item] = (max(inventories[team, player][target_item], levels[network_item.item])) + else: + inventories[team, player][target_item] += 1 + + group_key_locations |= player_small_key_locations[player] + group_big_key_locations |= player_big_key_locations[player] + + return render_template( + "multitracker__ALinkToThePast.html", + enabled_trackers=enabled_trackers, + current_tracker="A Link to the Past", + room=tracker_data.room, + room_players=tracker_data.get_team_players(), + locations=tracker_data.get_room_locations(), + locations_complete=tracker_data.get_room_locations_complete(), + total_team_locations=tracker_data.get_team_locations_total_count(), + total_team_locations_complete=tracker_data.get_team_locations_checked_count(), + player_names_with_alias=tracker_data.get_room_long_player_names(), + completed_worlds=tracker_data.get_team_completed_worlds_count(), + games=tracker_data.get_room_games(), + states=tracker_data.get_room_client_statuses(), + hints=tracker_data.get_team_hints(), + activity_timers=tracker_data.get_room_last_activity(), + videos=tracker_data.get_room_videos(), + item_id_to_name=tracker_data.item_id_to_name, + location_id_to_name=tracker_data.location_id_to_name, + inventories=inventories, + tracking_names=tracking_names, + tracking_ids=tracking_ids, + multi_items=multi_items, + checks_done=checks_done, + ordered_areas=ordered_areas, + checks_in_area=player_checks_in_area, + key_locations=group_key_locations, + big_key_locations=group_big_key_locations, + small_key_ids=small_key_ids, + big_key_ids=big_key_ids, + ) - display_data = {} + def render_ALinkToThePast_tracker(tracker_data: TrackerData, team: int, player: int) -> str: + # Helper objects. + alttp_id_lookup = tracker_data.item_name_to_id["A Link to the Past"] + + links = { + "Bow": "Progressive Bow", + "Silver Arrows": "Progressive Bow", + "Silver Bow": "Progressive Bow", + "Progressive Bow (Alt)": "Progressive Bow", + "Bottle (Red Potion)": "Bottle", + "Bottle (Green Potion)": "Bottle", + "Bottle (Blue Potion)": "Bottle", + "Bottle (Fairy)": "Bottle", + "Bottle (Bee)": "Bottle", + "Bottle (Good Bee)": "Bottle", + "Fighter Sword": "Progressive Sword", + "Master Sword": "Progressive Sword", + "Tempered Sword": "Progressive Sword", + "Golden Sword": "Progressive Sword", + "Power Glove": "Progressive Glove", + "Titans Mitts": "Progressive Glove", + } + links = {alttp_id_lookup[key]: alttp_id_lookup[value] for key, value in links.items()} + levels = { + "Fighter Sword": 1, + "Master Sword": 2, + "Tempered Sword": 3, + "Golden Sword": 4, + "Power Glove": 1, + "Titans Mitts": 2, + "Bow": 1, + "Silver Bow": 2, + "Triforce Piece": 90, + } + tracking_names = [ + "Progressive Sword", "Progressive Bow", "Book of Mudora", "Hammer", "Hookshot", "Magic Mirror", "Flute", + "Pegasus Boots", "Progressive Glove", "Flippers", "Moon Pearl", "Blue Boomerang", "Red Boomerang", + "Bug Catching Net", "Cape", "Shovel", "Lamp", "Mushroom", "Magic Powder", "Cane of Somaria", + "Cane of Byrna", "Fire Rod", "Ice Rod", "Bombos", "Ether", "Quake", "Bottle", "Triforce Piece", "Triforce", + ] + default_locations = { + "Light World": { + 1572864, 1572865, 60034, 1572867, 1572868, 60037, 1572869, 1572866, 60040, 59788, 60046, 60175, + 1572880, 60049, 60178, 1572883, 60052, 60181, 1572885, 60055, 60184, 191256, 60058, 60187, 1572884, + 1572886, 1572887, 1572906, 60202, 60205, 59824, 166320, 1010170, 60208, 60211, 60214, 60217, 59836, + 60220, 60223, 59839, 1573184, 60226, 975299, 1573188, 1573189, 188229, 60229, 60232, 1573193, + 1573194, 60235, 1573187, 59845, 59854, 211407, 60238, 59857, 1573185, 1573186, 1572882, 212328, + 59881, 59761, 59890, 59770, 193020, 212605 + }, + "Dark World": { + 59776, 59779, 975237, 1572870, 60043, 1572881, 60190, 60193, 60196, 60199, 60840, 1573190, 209095, + 1573192, 1573191, 60241, 60244, 60247, 60250, 59884, 59887, 60019, 60022, 60028, 60031 + }, + "Desert Palace": {1573216, 59842, 59851, 59791, 1573201, 59830}, + "Eastern Palace": {1573200, 59827, 59893, 59767, 59833, 59773}, + "Hyrule Castle": {60256, 60259, 60169, 60172, 59758, 59764, 60025, 60253}, + "Agahnims Tower": {60082, 60085}, + "Tower of Hera": {1573218, 59878, 59821, 1573202, 59896, 59899}, + "Swamp Palace": {60064, 60067, 60070, 59782, 59785, 60073, 60076, 60079, 1573204, 60061}, + "Thieves Town": {59905, 59908, 59911, 59914, 59917, 59920, 59923, 1573206}, + "Skull Woods": {59809, 59902, 59848, 59794, 1573205, 59800, 59803, 59806}, + "Ice Palace": {59872, 59875, 59812, 59818, 59860, 59797, 1573207, 59869}, + "Misery Mire": {60001, 60004, 60007, 60010, 60013, 1573208, 59866, 59998}, + "Turtle Rock": {59938, 59941, 59944, 1573209, 59947, 59950, 59953, 59956, 59926, 59929, 59932, 59935}, + "Palace of Darkness": { + 59968, 59971, 59974, 59977, 59980, 59983, 59986, 1573203, 59989, 59959, 59992, 59962, 59995, + 59965 + }, + "Ganons Tower": { + 60160, 60163, 60166, 60088, 60091, 60094, 60097, 60100, 60103, 60106, 60109, 60112, 60115, 60118, + 60121, 60124, 60127, 1573217, 60130, 60133, 60136, 60139, 60142, 60145, 60148, 60151, 60157 + }, + "Total": set() + } + key_only_locations = { + "Light World": set(), + "Dark World": set(), + "Desert Palace": {0x140031, 0x14002b, 0x140061, 0x140028}, + "Eastern Palace": {0x14005b, 0x140049}, + "Hyrule Castle": {0x140037, 0x140034, 0x14000d, 0x14003d}, + "Agahnims Tower": {0x140061, 0x140052}, + "Tower of Hera": set(), + "Swamp Palace": {0x140019, 0x140016, 0x140013, 0x140010, 0x14000a}, + "Thieves Town": {0x14005e, 0x14004f}, + "Skull Woods": {0x14002e, 0x14001c}, + "Ice Palace": {0x140004, 0x140022, 0x140025, 0x140046}, + "Misery Mire": {0x140055, 0x14004c, 0x140064}, + "Turtle Rock": {0x140058, 0x140007}, + "Palace of Darkness": set(), + "Ganons Tower": {0x140040, 0x140043, 0x14003a, 0x14001f}, + "Total": set() + } + location_to_area = {} + for area, locations in default_locations.items(): + for checked_location in locations: + location_to_area[checked_location] = area + for area, locations in key_only_locations.items(): + for checked_location in locations: + location_to_area[checked_location] = area + + checks_in_area = {area: len(checks) for area, checks in default_locations.items()} + checks_in_area["Total"] = 216 + ordered_areas = ( + "Light World", "Dark World", "Hyrule Castle", "Agahnims Tower", "Eastern Palace", "Desert Palace", + "Tower of Hera", "Palace of Darkness", "Swamp Palace", "Skull Woods", "Thieves Town", "Ice Palace", + "Misery Mire", "Turtle Rock", "Ganons Tower", "Total" + ) - # Multi-items - multi_items = { - "Map Width": 80000, - "Map Height": 80001, - "Map Bombs": 80002 - } - for item_name, item_id in multi_items.items(): - base_name = item_name.split()[-1].lower() - count = inventory[item_id] - display_data[base_name + "_count"] = count - display_data[base_name + "_display"] = count + 5 - - # Get location info - checked_locations = multisave.get("location_checks", {}).get((team, player), set()) - lookup_name = lambda id: lookup_any_location_id_to_name[id] - location_info = {tile_name: {lookup_name(tile_location): (tile_location in checked_locations)} for tile_name, tile_location in checksfinder_location_ids.items() if tile_location in set(locations[player])} - checks_done = {tile_name: len([tile_location]) for tile_name, tile_location in checksfinder_location_ids.items() if tile_location in checked_locations and tile_location in set(locations[player])} - checks_done['Total'] = len(checked_locations) - checks_in_area = checks_done - - # Calculate checks available - display_data["checks_unlocked"] = min(display_data["width_count"] + display_data["height_count"] + display_data["bombs_count"] + 5, 25) - display_data["checks_available"] = max(display_data["checks_unlocked"] - len(checked_locations), 0) - - # Victory condition - game_state = multisave.get("client_game_state", {}).get((team, player), 0) - display_data['game_finished'] = game_state == 30 - - return render_template("checksfinderTracker.html", - inventory=inventory, icons=icons, - acquired_items={lookup_any_item_id_to_name[id] for id in inventory if - id in lookup_any_item_id_to_name}, - player=player, team=team, room=room, player_name=playerName, - checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, - **display_data) - -def __renderGenericTracker(multisave: Dict[str, Any], room: Room, locations: Dict[int, Dict[int, Tuple[int, int, int]]], - inventory: Counter, team: int, player: int, playerName: str, - seed_checks_in_area: Dict[int, Dict[str, int]], checks_done: Dict[str, int], - saving_second: int, custom_locations: Dict[int, str], custom_items: Dict[int, str]) -> str: - - checked_locations = multisave.get("location_checks", {}).get((team, player), set()) - player_received_items = {} - if multisave.get('version', 0) > 0: - ordered_items = multisave.get('received_items', {}).get((team, player, True), []) - else: - ordered_items = multisave.get('received_items', {}).get((team, player), []) - - # add numbering to all items but starter_inventory - for order_index, networkItem in enumerate(ordered_items, start=1): - player_received_items[networkItem.item] = order_index - - return render_template("genericTracker.html", - inventory=inventory, - player=player, team=team, room=room, player_name=playerName, - checked_locations=checked_locations, - not_checked_locations=set(locations[player]) - checked_locations, - received_items=player_received_items, saving_second=saving_second, - custom_items=custom_items, custom_locations=custom_locations) - - -def get_enabled_multiworld_trackers(room: Room, current: str): - enabled = [ - { - "name": "Generic", - "endpoint": "get_multiworld_tracker", - "current": current == "Generic" - } - ] - for game_name, endpoint in multi_trackers.items(): - if any(slot.game == game_name for slot in room.seed.slots) or current == game_name: - enabled.append({ - "name": game_name, - "endpoint": endpoint.__name__, - "current": current == game_name} - ) - return enabled - - -def _get_multiworld_tracker_data(tracker: UUID) -> typing.Optional[typing.Dict[str, typing.Any]]: - room: Room = Room.get(tracker=tracker) - if not room: - return None + tracking_ids = [] + for item in tracking_names: + tracking_ids.append(alttp_id_lookup[item]) + + # Can't wait to get this into the apworld. Oof. + from worlds.alttp import Items + + small_key_ids = {} + big_key_ids = {} + ids_small_key = {} + ids_big_key = {} + for item_name, data in Items.item_table.items(): + if "Key" in item_name: + area = item_name.split("(")[1][:-1] + if "Small" in item_name: + small_key_ids[area] = data[2] + ids_small_key[data[2]] = area + else: + big_key_ids[area] = data[2] + ids_big_key[data[2]] = area + + inventory = collections.Counter() + checks_done = {loc_name: 0 for loc_name in default_locations} + player_big_key_locations = set() + player_small_key_locations = set() + + player_locations = tracker_data.get_player_locations(team, player) + for checked_location in tracker_data.get_player_checked_locations(team, player): + if checked_location in player_locations: + area_name = location_to_area.get(checked_location, None) + if area_name: + checks_done[area_name] += 1 + + checks_done["Total"] += 1 + + for received_item in tracker_data.get_player_received_items(team, player): + target_item = links.get(received_item.item, received_item.item) + if received_item.item in levels: # non-progressive + inventory[target_item] = max(inventory[target_item], levels[received_item.item]) + else: + inventory[target_item] += 1 + + for location, (item_id, _, _) in player_locations.items(): + if item_id in ids_big_key: + player_big_key_locations.add(ids_big_key[item_id]) + elif item_id in ids_small_key: + player_small_key_locations.add(ids_small_key[item_id]) + + # Note the presence of the triforce item + if tracker_data.get_player_client_status(team, player) == ClientStatus.CLIENT_GOAL: + inventory[106] = 1 # Triforce + + # Progressive items need special handling for icons and class + progressive_items = { + "Progressive Sword": 94, + "Progressive Glove": 97, + "Progressive Bow": 100, + "Progressive Mail": 96, + "Progressive Shield": 95, + } + progressive_names = { + "Progressive Sword": [None, "Fighter Sword", "Master Sword", "Tempered Sword", "Golden Sword"], + "Progressive Glove": [None, "Power Glove", "Titan Mitts"], + "Progressive Bow": [None, "Bow", "Silver Bow"], + "Progressive Mail": ["Green Mail", "Blue Mail", "Red Mail"], + "Progressive Shield": [None, "Blue Shield", "Red Shield", "Mirror Shield"] + } - locations, names, use_door_tracker, checks_in_area, player_location_to_area, \ - precollected_items, games, slot_data, groups, saving_second, custom_locations, custom_items = \ - get_static_room_data(room) + # Determine which icon to use + display_data = {} + for item_name, item_id in progressive_items.items(): + level = min(inventory[item_id], len(progressive_names[item_name]) - 1) + display_name = progressive_names[item_name][level] + acquired = True + if not display_name: + acquired = False + display_name = progressive_names[item_name][level + 1] + base_name = item_name.split(maxsplit=1)[1].lower() + display_data[base_name + "_acquired"] = acquired + display_data[base_name + "_icon"] = display_name + + # The single player tracker doesn't care about overworld, underworld, and total checks. Maybe it should? + sp_areas = ordered_areas[2:15] + + return render_template( + template_name_or_list="tracker__ALinkToThePast.html", + room=tracker_data.room, + team=team, + player=player, + inventory=inventory, + player_name=tracker_data.get_player_name(team, player), + checks_done=checks_done, + checks_in_area=checks_in_area, + acquired_items={tracker_data.item_id_to_name["A Link to the Past"][id] for id in inventory}, + sp_areas=sp_areas, + small_key_ids=small_key_ids, + key_locations=player_small_key_locations, + big_key_ids=big_key_ids, + big_key_locations=player_big_key_locations, + **display_data, + ) - checks_done = {teamnumber: {playernumber: {loc_name: 0 for loc_name in default_locations} - for playernumber in range(1, len(team) + 1) if playernumber not in groups} - for teamnumber, team in enumerate(names)} + _multiworld_trackers["A Link to the Past"] = render_ALinkToThePast_multiworld_tracker + _player_trackers["A Link to the Past"] = render_ALinkToThePast_tracker + +if "Minecraft" in network_data_package["games"]: + def render_Minecraft_tracker(tracker_data: TrackerData, team: int, player: int) -> str: + icons = { + "Wooden Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/d/d2/Wooden_Pickaxe_JE3_BE3.png", + "Stone Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/c4/Stone_Pickaxe_JE2_BE2.png", + "Iron Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/d/d1/Iron_Pickaxe_JE3_BE2.png", + "Diamond Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/e/e7/Diamond_Pickaxe_JE3_BE3.png", + "Wooden Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/d/d5/Wooden_Sword_JE2_BE2.png", + "Stone Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/b/b1/Stone_Sword_JE2_BE2.png", + "Iron Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/8/8e/Iron_Sword_JE2_BE2.png", + "Diamond Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/4/44/Diamond_Sword_JE3_BE3.png", + "Leather Tunic": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/b/b7/Leather_Tunic_JE4_BE2.png", + "Iron Chestplate": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/31/Iron_Chestplate_JE2_BE2.png", + "Diamond Chestplate": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/e/e0/Diamond_Chestplate_JE3_BE2.png", + "Iron Ingot": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/fc/Iron_Ingot_JE3_BE2.png", + "Block of Iron": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/7/7e/Block_of_Iron_JE4_BE3.png", + "Brewing Stand": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/b/b3/Brewing_Stand_%28empty%29_JE10.png", + "Ender Pearl": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/f6/Ender_Pearl_JE3_BE2.png", + "Bucket": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/fc/Bucket_JE2_BE2.png", + "Bow": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/a/ab/Bow_%28Pull_2%29_JE1_BE1.png", + "Shield": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/c6/Shield_JE2_BE1.png", + "Red Bed": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/6/6a/Red_Bed_%28N%29.png", + "Netherite Scrap": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/33/Netherite_Scrap_JE2_BE1.png", + "Flint and Steel": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/9/94/Flint_and_Steel_JE4_BE2.png", + "Enchanting Table": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/31/Enchanting_Table.gif", + "Fishing Rod": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/7/7f/Fishing_Rod_JE2_BE2.png", + "Campfire": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/9/91/Campfire_JE2_BE2.gif", + "Water Bottle": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/7/75/Water_Bottle_JE2_BE2.png", + "Spyglass": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/c1/Spyglass_JE2_BE1.png", + "Dragon Egg Shard": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/38/Dragon_Egg_JE4.png", + "Lead": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/1/1f/Lead_JE2_BE2.png", + "Saddle": "https://i.imgur.com/2QtDyR0.png", + "Channeling Book": "https://i.imgur.com/J3WsYZw.png", + "Silk Touch Book": "https://i.imgur.com/iqERxHQ.png", + "Piercing IV Book": "https://i.imgur.com/OzJptGz.png", + } - percent_total_checks_done = {teamnumber: {playernumber: 0 - for playernumber in range(1, len(team) + 1) if playernumber not in groups} - for teamnumber, team in enumerate(names)} + minecraft_location_ids = { + "Story": [42073, 42023, 42027, 42039, 42002, 42009, 42010, 42070, + 42041, 42049, 42004, 42031, 42025, 42029, 42051, 42077], + "Nether": [42017, 42044, 42069, 42058, 42034, 42060, 42066, 42076, 42064, 42071, 42021, + 42062, 42008, 42061, 42033, 42011, 42006, 42019, 42000, 42040, 42001, 42015, 42104, 42014], + "The End": [42052, 42005, 42012, 42032, 42030, 42042, 42018, 42038, 42046], + "Adventure": [42047, 42050, 42096, 42097, 42098, 42059, 42055, 42072, 42003, 42109, 42035, 42016, 42020, + 42048, 42054, 42068, 42043, 42106, 42074, 42075, 42024, 42026, 42037, 42045, 42056, 42105, + 42099, 42103, 42110, 42100], + "Husbandry": [42065, 42067, 42078, 42022, 42113, 42107, 42007, 42079, 42013, 42028, 42036, 42108, 42111, + 42112, + 42057, 42063, 42053, 42102, 42101, 42092, 42093, 42094, 42095], + "Archipelago": [42080, 42081, 42082, 42083, 42084, 42085, 42086, 42087, 42088, 42089, 42090, 42091], + } - total_locations = {teamnumber: sum(len(locations[playernumber]) - for playernumber in range(1, len(team) + 1) if playernumber not in groups) - for teamnumber, team in enumerate(names)} + display_data = {} - hints = {team: set() for team in range(len(names))} - if room.multisave: - multisave = restricted_loads(room.multisave) - else: - multisave = {} - if "hints" in multisave: - for (team, slot), slot_hints in multisave["hints"].items(): - hints[team] |= set(slot_hints) - - for (team, player), locations_checked in multisave.get("location_checks", {}).items(): - if player in groups: - continue - player_locations = locations[player] - checks_done[team][player]["Total"] = len(locations_checked) - percent_total_checks_done[team][player] = ( - checks_done[team][player]["Total"] / len(player_locations) * 100 - if player_locations - else 100 + # Determine display for progressive items + progressive_items = { + "Progressive Tools": 45013, + "Progressive Weapons": 45012, + "Progressive Armor": 45014, + "Progressive Resource Crafting": 45001 + } + progressive_names = { + "Progressive Tools": ["Wooden Pickaxe", "Stone Pickaxe", "Iron Pickaxe", "Diamond Pickaxe"], + "Progressive Weapons": ["Wooden Sword", "Stone Sword", "Iron Sword", "Diamond Sword"], + "Progressive Armor": ["Leather Tunic", "Iron Chestplate", "Diamond Chestplate"], + "Progressive Resource Crafting": ["Iron Ingot", "Iron Ingot", "Block of Iron"] + } + + inventory = tracker_data.get_player_inventory_counts(team, player) + for item_name, item_id in progressive_items.items(): + level = min(inventory[item_id], len(progressive_names[item_name]) - 1) + display_name = progressive_names[item_name][level] + base_name = item_name.split(maxsplit=1)[1].lower().replace(" ", "_") + display_data[base_name + "_url"] = icons[display_name] + + # Multi-items + multi_items = { + "3 Ender Pearls": 45029, + "8 Netherite Scrap": 45015, + "Dragon Egg Shard": 45043 + } + for item_name, item_id in multi_items.items(): + base_name = item_name.split()[-1].lower() + count = inventory[item_id] + if count >= 0: + display_data[base_name + "_count"] = count + + # Victory condition + game_state = tracker_data.get_player_client_status(team, player) + display_data["game_finished"] = game_state == 30 + + # Turn location IDs into advancement tab counts + checked_locations = tracker_data.get_player_checked_locations(team, player) + lookup_name = lambda id: tracker_data.location_id_to_name["Minecraft"][id] + location_info = {tab_name: {lookup_name(id): (id in checked_locations) for id in tab_locations} + for tab_name, tab_locations in minecraft_location_ids.items()} + checks_done = {tab_name: len([id for id in tab_locations if id in checked_locations]) + for tab_name, tab_locations in minecraft_location_ids.items()} + checks_done["Total"] = len(checked_locations) + checks_in_area = {tab_name: len(tab_locations) for tab_name, tab_locations in minecraft_location_ids.items()} + checks_in_area["Total"] = sum(checks_in_area.values()) + + lookup_any_item_id_to_name = tracker_data.item_id_to_name["Minecraft"] + return render_template( + "tracker__Minecraft.html", + inventory=inventory, + icons=icons, + acquired_items={lookup_any_item_id_to_name[id] for id, count in inventory.items() if count > 0}, + player=player, + team=team, + room=tracker_data.room, + player_name=tracker_data.get_player_name(team, player), + saving_second=tracker_data.get_room_saving_second(), + checks_done=checks_done, + checks_in_area=checks_in_area, + location_info=location_info, + **display_data, ) - activity_timers = {} - now = datetime.datetime.utcnow() - for (team, player), timestamp in multisave.get("client_activity_timers", []): - activity_timers[team, player] = now - datetime.datetime.utcfromtimestamp(timestamp) - - player_names = {} - completed_worlds = 0 - states: typing.Dict[typing.Tuple[int, int], int] = {} - for team, names in enumerate(names): - for player, name in enumerate(names, 1): - player_names[team, player] = name - states[team, player] = multisave.get("client_game_state", {}).get((team, player), 0) - if states[team, player] == ClientStatus.CLIENT_GOAL and player not in groups: - completed_worlds += 1 - long_player_names = player_names.copy() - for (team, player), alias in multisave.get("name_aliases", {}).items(): - player_names[team, player] = alias - long_player_names[(team, player)] = f"{alias} ({long_player_names[team, player]})" - - video = {} - for (team, player), data in multisave.get("video", []): - video[team, player] = data - - return dict( - player_names=player_names, room=room, checks_done=checks_done, - percent_total_checks_done=percent_total_checks_done, checks_in_area=checks_in_area, - activity_timers=activity_timers, video=video, hints=hints, - long_player_names=long_player_names, - multisave=multisave, precollected_items=precollected_items, groups=groups, - locations=locations, total_locations=total_locations, games=games, states=states, - completed_worlds=completed_worlds, - custom_locations=custom_locations, custom_items=custom_items, - ) + _player_trackers["Minecraft"] = render_Minecraft_tracker + +if "Ocarina of Time" in network_data_package["games"]: + def render_OcarinaOfTime_tracker(tracker_data: TrackerData, team: int, player: int) -> str: + icons = { + "Fairy Ocarina": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/97/OoT_Fairy_Ocarina_Icon.png", + "Ocarina of Time": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/4/4e/OoT_Ocarina_of_Time_Icon.png", + "Slingshot": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/3/32/OoT_Fairy_Slingshot_Icon.png", + "Boomerang": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/d/d5/OoT_Boomerang_Icon.png", + "Bottle": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/f/fc/OoT_Bottle_Icon.png", + "Rutos Letter": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/OoT_Letter_Icon.png", + "Bombs": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/1/11/OoT_Bomb_Icon.png", + "Bombchus": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/3/36/OoT_Bombchu_Icon.png", + "Lens of Truth": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/0/05/OoT_Lens_of_Truth_Icon.png", + "Bow": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/9a/OoT_Fairy_Bow_Icon.png", + "Hookshot": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/7/77/OoT_Hookshot_Icon.png", + "Longshot": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/a/a4/OoT_Longshot_Icon.png", + "Megaton Hammer": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/93/OoT_Megaton_Hammer_Icon.png", + "Fire Arrows": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/1/1e/OoT_Fire_Arrow_Icon.png", + "Ice Arrows": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/3/3c/OoT_Ice_Arrow_Icon.png", + "Light Arrows": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/7/76/OoT_Light_Arrow_Icon.png", + "Dins Fire": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/d/da/OoT_Din%27s_Fire_Icon.png", + "Farores Wind": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/7/7a/OoT_Farore%27s_Wind_Icon.png", + "Nayrus Love": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/b/be/OoT_Nayru%27s_Love_Icon.png", + "Kokiri Sword": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/5/53/OoT_Kokiri_Sword_Icon.png", + "Biggoron Sword": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/2e/OoT_Giant%27s_Knife_Icon.png", + "Mirror Shield": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/b/b0/OoT_Mirror_Shield_Icon_2.png", + "Goron Bracelet": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/b/b7/OoT_Goron%27s_Bracelet_Icon.png", + "Silver Gauntlets": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/b/b9/OoT_Silver_Gauntlets_Icon.png", + "Golden Gauntlets": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/6/6a/OoT_Golden_Gauntlets_Icon.png", + "Goron Tunic": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/1/1c/OoT_Goron_Tunic_Icon.png", + "Zora Tunic": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/2c/OoT_Zora_Tunic_Icon.png", + "Silver Scale": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/4/4e/OoT_Silver_Scale_Icon.png", + "Gold Scale": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/95/OoT_Golden_Scale_Icon.png", + "Iron Boots": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/3/34/OoT_Iron_Boots_Icon.png", + "Hover Boots": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/22/OoT_Hover_Boots_Icon.png", + "Adults Wallet": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/f/f9/OoT_Adult%27s_Wallet_Icon.png", + "Giants Wallet": r"https://static.wikia.nocookie.net/zelda_gamepedia_en/images/8/87/OoT_Giant%27s_Wallet_Icon.png", + "Small Magic": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/9f/OoT3D_Magic_Jar_Icon.png", + "Large Magic": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/3/3e/OoT3D_Large_Magic_Jar_Icon.png", + "Gerudo Membership Card": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/4/4e/OoT_Gerudo_Token_Icon.png", + "Gold Skulltula Token": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/4/47/OoT_Token_Icon.png", + "Triforce Piece": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/0/0b/SS_Triforce_Piece_Icon.png", + "Triforce": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/6/68/ALttP_Triforce_Title_Sprite.png", + "Zeldas Lullaby": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", + "Eponas Song": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", + "Sarias Song": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", + "Suns Song": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", + "Song of Time": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", + "Song of Storms": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/2/21/Grey_Note.png", + "Minuet of Forest": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/e/e4/Green_Note.png", + "Bolero of Fire": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/f/f0/Red_Note.png", + "Serenade of Water": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/0/0f/Blue_Note.png", + "Requiem of Spirit": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/a/a4/Orange_Note.png", + "Nocturne of Shadow": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/97/Purple_Note.png", + "Prelude of Light": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/90/Yellow_Note.png", + "Small Key": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/e/e5/OoT_Small_Key_Icon.png", + "Boss Key": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/4/40/OoT_Boss_Key_Icon.png", + } + display_data = {} -def _get_inventory_data(data: typing.Dict[str, typing.Any]) \ - -> typing.Dict[int, typing.Dict[int, typing.Dict[int, int]]]: - inventory: typing.Dict[int, typing.Dict[int, typing.Dict[int, int]]] = { - teamnumber: {playernumber: collections.Counter() for playernumber in team_data} - for teamnumber, team_data in data["checks_done"].items() - } + # Determine display for progressive items + progressive_items = { + "Progressive Hookshot": 66128, + "Progressive Strength Upgrade": 66129, + "Progressive Wallet": 66133, + "Progressive Scale": 66134, + "Magic Meter": 66138, + "Ocarina": 66139, + } - groups = data["groups"] - - for (team, player), locations_checked in data["multisave"].get("location_checks", {}).items(): - if player in data["groups"]: - continue - player_locations = data["locations"][player] - precollected = data["precollected_items"][player] - for item_id in precollected: - inventory[team][player][item_id] += 1 - for location in locations_checked: - item_id, recipient, flags = player_locations[location] - recipients = groups.get(recipient, [recipient]) - for recipient in recipients: - inventory[team][recipient][item_id] += 1 - return inventory - - -def _get_named_inventory(inventory: typing.Dict[int, int], custom_items: typing.Dict[int, str] = None) \ - -> typing.Dict[str, int]: - """slow""" - if custom_items: - mapping = collections.ChainMap(custom_items, lookup_any_item_id_to_name) - else: - mapping = lookup_any_item_id_to_name + progressive_names = { + "Progressive Hookshot": ["Hookshot", "Hookshot", "Longshot"], + "Progressive Strength Upgrade": ["Goron Bracelet", "Goron Bracelet", "Silver Gauntlets", + "Golden Gauntlets"], + "Progressive Wallet": ["Adults Wallet", "Adults Wallet", "Giants Wallet", "Giants Wallet"], + "Progressive Scale": ["Silver Scale", "Silver Scale", "Gold Scale"], + "Magic Meter": ["Small Magic", "Small Magic", "Large Magic"], + "Ocarina": ["Fairy Ocarina", "Fairy Ocarina", "Ocarina of Time"] + } - return collections.Counter({mapping.get(item_id, None): count for item_id, count in inventory.items()}) + inventory = tracker_data.get_player_inventory_counts(team, player) + for item_name, item_id in progressive_items.items(): + level = min(inventory[item_id], len(progressive_names[item_name]) - 1) + display_name = progressive_names[item_name][level] + if item_name.startswith("Progressive"): + base_name = item_name.split(maxsplit=1)[1].lower().replace(" ", "_") + else: + base_name = item_name.lower().replace(" ", "_") + display_data[base_name + "_url"] = icons[display_name] + + if base_name == "hookshot": + display_data["hookshot_length"] = {0: "", 1: "H", 2: "L"}.get(level) + if base_name == "wallet": + display_data["wallet_size"] = {0: "99", 1: "200", 2: "500", 3: "999"}.get(level) + + # Determine display for bottles. Show letter if it's obtained, determine bottle count + bottle_ids = [66015, 66020, 66021, 66140, 66141, 66142, 66143, 66144, 66145, 66146, 66147, 66148] + display_data["bottle_count"] = min(sum(map(lambda item_id: inventory[item_id], bottle_ids)), 4) + display_data["bottle_url"] = icons["Rutos Letter"] if inventory[66021] > 0 else icons["Bottle"] + + # Determine bombchu display + display_data["has_bombchus"] = any(map(lambda item_id: inventory[item_id] > 0, [66003, 66106, 66107, 66137])) + + # Multi-items + multi_items = { + "Gold Skulltula Token": 66091, + "Triforce Piece": 66202, + } + for item_name, item_id in multi_items.items(): + base_name = item_name.split()[-1].lower() + display_data[base_name + "_count"] = inventory[item_id] + + # Gather dungeon locations + area_id_ranges = { + "Overworld": ((67000, 67263), (67269, 67280), (67747, 68024), (68054, 68062)), + "Deku Tree": ((67281, 67303), (68063, 68077)), + "Dodongo's Cavern": ((67304, 67334), (68078, 68160)), + "Jabu Jabu's Belly": ((67335, 67359), (68161, 68188)), + "Bottom of the Well": ((67360, 67384), (68189, 68230)), + "Forest Temple": ((67385, 67420), (68231, 68281)), + "Fire Temple": ((67421, 67457), (68282, 68350)), + "Water Temple": ((67458, 67484), (68351, 68483)), + "Shadow Temple": ((67485, 67532), (68484, 68565)), + "Spirit Temple": ((67533, 67582), (68566, 68625)), + "Ice Cavern": ((67583, 67596), (68626, 68649)), + "Gerudo Training Ground": ((67597, 67635), (68650, 68656)), + "Thieves' Hideout": ((67264, 67268), (68025, 68053)), + "Ganon's Castle": ((67636, 67673), (68657, 68705)), + } + def lookup_and_trim(id, area): + full_name = tracker_data.location_id_to_name["Ocarina of Time"][id] + if "Ganons Tower" in full_name: + return full_name + if area not in ["Overworld", "Thieves' Hideout"]: + # trim dungeon name. leaves an extra space that doesn't display, or trims fully for DC/Jabu/GC + return full_name[len(area):] + return full_name -@app.route('/tracker/') -@cache.memoize(timeout=60) # multisave is currently created at most every minute -def get_multiworld_tracker(tracker: UUID): - data = _get_multiworld_tracker_data(tracker) - if not data: - abort(404) + locations = tracker_data.get_player_locations(team, player) + checked_locations = tracker_data.get_player_checked_locations(team, player).intersection(set(locations)) + location_info = {} + checks_done = {} + checks_in_area = {} + for area, ranges in area_id_ranges.items(): + location_info[area] = {} + checks_done[area] = 0 + checks_in_area[area] = 0 + for r in ranges: + min_id, max_id = r + for id in range(min_id, max_id + 1): + if id in locations: + checked = id in checked_locations + location_info[area][lookup_and_trim(id, area)] = checked + checks_in_area[area] += 1 + checks_done[area] += checked + + checks_done["Total"] = sum(checks_done.values()) + checks_in_area["Total"] = sum(checks_in_area.values()) + + # Give skulltulas on non-tracked locations + non_tracked_locations = tracker_data.get_player_checked_locations(team, player).difference(set(locations)) + for id in non_tracked_locations: + if "GS" in lookup_and_trim(id, ""): + display_data["token_count"] += 1 + + oot_y = "✔" + oot_x = "✕" + + # Gather small and boss key info + small_key_counts = { + "Forest Temple": oot_y if inventory[66203] else inventory[66175], + "Fire Temple": oot_y if inventory[66204] else inventory[66176], + "Water Temple": oot_y if inventory[66205] else inventory[66177], + "Spirit Temple": oot_y if inventory[66206] else inventory[66178], + "Shadow Temple": oot_y if inventory[66207] else inventory[66179], + "Bottom of the Well": oot_y if inventory[66208] else inventory[66180], + "Gerudo Training Ground": oot_y if inventory[66209] else inventory[66181], + "Thieves' Hideout": oot_y if inventory[66210] else inventory[66182], + "Ganon's Castle": oot_y if inventory[66211] else inventory[66183], + } + boss_key_counts = { + "Forest Temple": oot_y if inventory[66149] else oot_x, + "Fire Temple": oot_y if inventory[66150] else oot_x, + "Water Temple": oot_y if inventory[66151] else oot_x, + "Spirit Temple": oot_y if inventory[66152] else oot_x, + "Shadow Temple": oot_y if inventory[66153] else oot_x, + "Ganon's Castle": oot_y if inventory[66154] else oot_x, + } - data["enabled_multiworld_trackers"] = get_enabled_multiworld_trackers(data["room"], "Generic") + # Victory condition + game_state = tracker_data.get_player_client_status(team, player) + display_data["game_finished"] = game_state == 30 + + lookup_any_item_id_to_name = tracker_data.item_id_to_name["Ocarina of Time"] + return render_template( + "tracker__OcarinaOfTime.html", + inventory=inventory, + player=player, + team=team, + room=tracker_data.room, + player_name=tracker_data.get_player_name(team, player), + icons=icons, + acquired_items={lookup_any_item_id_to_name[id] for id, count in inventory.items() if count > 0}, + checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, + small_key_counts=small_key_counts, + boss_key_counts=boss_key_counts, + **display_data, + ) - return render_template("multiTracker.html", **data) + _player_trackers["Ocarina of Time"] = render_OcarinaOfTime_tracker + +if "Timespinner" in network_data_package["games"]: + def render_Timespinner_tracker(tracker_data: TrackerData, team: int, player: int) -> str: + icons = { + "Timespinner Wheel": "https://timespinnerwiki.com/mediawiki/images/7/76/Timespinner_Wheel.png", + "Timespinner Spindle": "https://timespinnerwiki.com/mediawiki/images/1/1a/Timespinner_Spindle.png", + "Timespinner Gear 1": "https://timespinnerwiki.com/mediawiki/images/3/3c/Timespinner_Gear_1.png", + "Timespinner Gear 2": "https://timespinnerwiki.com/mediawiki/images/e/e9/Timespinner_Gear_2.png", + "Timespinner Gear 3": "https://timespinnerwiki.com/mediawiki/images/2/22/Timespinner_Gear_3.png", + "Talaria Attachment": "https://timespinnerwiki.com/mediawiki/images/6/61/Talaria_Attachment.png", + "Succubus Hairpin": "https://timespinnerwiki.com/mediawiki/images/4/49/Succubus_Hairpin.png", + "Lightwall": "https://timespinnerwiki.com/mediawiki/images/0/03/Lightwall.png", + "Celestial Sash": "https://timespinnerwiki.com/mediawiki/images/f/f1/Celestial_Sash.png", + "Twin Pyramid Key": "https://timespinnerwiki.com/mediawiki/images/4/49/Twin_Pyramid_Key.png", + "Security Keycard D": "https://timespinnerwiki.com/mediawiki/images/1/1b/Security_Keycard_D.png", + "Security Keycard C": "https://timespinnerwiki.com/mediawiki/images/e/e5/Security_Keycard_C.png", + "Security Keycard B": "https://timespinnerwiki.com/mediawiki/images/f/f6/Security_Keycard_B.png", + "Security Keycard A": "https://timespinnerwiki.com/mediawiki/images/b/b9/Security_Keycard_A.png", + "Library Keycard V": "https://timespinnerwiki.com/mediawiki/images/5/50/Library_Keycard_V.png", + "Tablet": "https://timespinnerwiki.com/mediawiki/images/a/a0/Tablet.png", + "Elevator Keycard": "https://timespinnerwiki.com/mediawiki/images/5/55/Elevator_Keycard.png", + "Oculus Ring": "https://timespinnerwiki.com/mediawiki/images/8/8d/Oculus_Ring.png", + "Water Mask": "https://timespinnerwiki.com/mediawiki/images/0/04/Water_Mask.png", + "Gas Mask": "https://timespinnerwiki.com/mediawiki/images/2/2e/Gas_Mask.png", + "Djinn Inferno": "https://timespinnerwiki.com/mediawiki/images/f/f6/Djinn_Inferno.png", + "Pyro Ring": "https://timespinnerwiki.com/mediawiki/images/2/2c/Pyro_Ring.png", + "Infernal Flames": "https://timespinnerwiki.com/mediawiki/images/1/1f/Infernal_Flames.png", + "Fire Orb": "https://timespinnerwiki.com/mediawiki/images/3/3e/Fire_Orb.png", + "Royal Ring": "https://timespinnerwiki.com/mediawiki/images/f/f3/Royal_Ring.png", + "Plasma Geyser": "https://timespinnerwiki.com/mediawiki/images/1/12/Plasma_Geyser.png", + "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", + } -if "Factorio" in games: - @app.route('/tracker//Factorio') - @cache.memoize(timeout=60) # multisave is currently created at most every minute - def get_Factorio_multiworld_tracker(tracker: UUID): - data = _get_multiworld_tracker_data(tracker) - if not data: - abort(404) + timespinner_location_ids = { + "Present": [ + 1337000, 1337001, 1337002, 1337003, 1337004, 1337005, 1337006, 1337007, 1337008, 1337009, + 1337010, 1337011, 1337012, 1337013, 1337014, 1337015, 1337016, 1337017, 1337018, 1337019, + 1337020, 1337021, 1337022, 1337023, 1337024, 1337025, 1337026, 1337027, 1337028, 1337029, + 1337030, 1337031, 1337032, 1337033, 1337034, 1337035, 1337036, 1337037, 1337038, 1337039, + 1337040, 1337041, 1337042, 1337043, 1337044, 1337045, 1337046, 1337047, 1337048, 1337049, + 1337050, 1337051, 1337052, 1337053, 1337054, 1337055, 1337056, 1337057, 1337058, 1337059, + 1337060, 1337061, 1337062, 1337063, 1337064, 1337065, 1337066, 1337067, 1337068, 1337069, + 1337070, 1337071, 1337072, 1337073, 1337074, 1337075, 1337076, 1337077, 1337078, 1337079, + 1337080, 1337081, 1337082, 1337083, 1337084, 1337085], + "Past": [ + 1337086, 1337087, 1337088, 1337089, + 1337090, 1337091, 1337092, 1337093, 1337094, 1337095, 1337096, 1337097, 1337098, 1337099, + 1337100, 1337101, 1337102, 1337103, 1337104, 1337105, 1337106, 1337107, 1337108, 1337109, + 1337110, 1337111, 1337112, 1337113, 1337114, 1337115, 1337116, 1337117, 1337118, 1337119, + 1337120, 1337121, 1337122, 1337123, 1337124, 1337125, 1337126, 1337127, 1337128, 1337129, + 1337130, 1337131, 1337132, 1337133, 1337134, 1337135, 1337136, 1337137, 1337138, 1337139, + 1337140, 1337141, 1337142, 1337143, 1337144, 1337145, 1337146, 1337147, 1337148, 1337149, + 1337150, 1337151, 1337152, 1337153, 1337154, 1337155, + 1337171, 1337172, 1337173, 1337174, 1337175], + "Ancient Pyramid": [ + 1337236, + 1337246, 1337247, 1337248, 1337249] + } - data["inventory"] = _get_inventory_data(data) - data["named_inventory"] = {team_id : { - player_id: _get_named_inventory(inventory, data["custom_items"]) - for player_id, inventory in team_inventory.items() - } for team_id, team_inventory in data["inventory"].items()} - data["enabled_multiworld_trackers"] = get_enabled_multiworld_trackers(data["room"], "Factorio") + slot_data = tracker_data.get_slot_data(team, player) + if (slot_data["DownloadableItems"]): + timespinner_location_ids["Present"] += [ + 1337156, 1337157, 1337159, + 1337160, 1337161, 1337162, 1337163, 1337164, 1337165, 1337166, 1337167, 1337168, 1337169, + 1337170] + if (slot_data["Cantoran"]): + timespinner_location_ids["Past"].append(1337176) + if (slot_data["LoreChecks"]): + timespinner_location_ids["Present"] += [ + 1337177, 1337178, 1337179, + 1337180, 1337181, 1337182, 1337183, 1337184, 1337185, 1337186, 1337187] + timespinner_location_ids["Past"] += [ + 1337188, 1337189, + 1337190, 1337191, 1337192, 1337193, 1337194, 1337195, 1337196, 1337197, 1337198] + if (slot_data["GyreArchives"]): + timespinner_location_ids["Ancient Pyramid"] += [ + 1337237, 1337238, 1337239, + 1337240, 1337241, 1337242, 1337243, 1337244, 1337245] + + display_data = {} + + # Victory condition + game_state = tracker_data.get_player_client_status(team, player) + display_data["game_finished"] = game_state == 30 + + inventory = tracker_data.get_player_inventory_counts(team, player) + + # Turn location IDs into advancement tab counts + checked_locations = tracker_data.get_player_checked_locations(team, player) + lookup_name = lambda id: tracker_data.location_id_to_name["Timespinner"][id] + location_info = {tab_name: {lookup_name(id): (id in checked_locations) for id in tab_locations} + for tab_name, tab_locations in timespinner_location_ids.items()} + checks_done = {tab_name: len([id for id in tab_locations if id in checked_locations]) + for tab_name, tab_locations in timespinner_location_ids.items()} + checks_done["Total"] = len(checked_locations) + checks_in_area = {tab_name: len(tab_locations) for tab_name, tab_locations in timespinner_location_ids.items()} + checks_in_area["Total"] = sum(checks_in_area.values()) + options = {k for k, v in slot_data.items() if v} + + lookup_any_item_id_to_name = tracker_data.item_id_to_name["Timespinner"] + return render_template( + "tracker__Timespinner.html", + inventory=inventory, + icons=icons, + acquired_items={lookup_any_item_id_to_name[id] for id, count in inventory.items() if count > 0}, + player=player, + team=team, + room=tracker_data.room, + player_name=tracker_data.get_player_name(team, player), + checks_done=checks_done, + checks_in_area=checks_in_area, + location_info=location_info, + options=options, + **display_data, + ) - return render_template("multiFactorioTracker.html", **data) + _player_trackers["Timespinner"] = render_Timespinner_tracker + +if "Super Metroid" in network_data_package["games"]: + def render_SuperMetroid_tracker(tracker_data: TrackerData, team: int, player: int) -> str: + icons = { + "Energy Tank": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/ETank.png", + "Missile": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Missile.png", + "Super Missile": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Super.png", + "Power Bomb": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/PowerBomb.png", + "Bomb": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Bomb.png", + "Charge Beam": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Charge.png", + "Ice Beam": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Ice.png", + "Hi-Jump Boots": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/HiJump.png", + "Speed Booster": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/SpeedBooster.png", + "Wave Beam": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Wave.png", + "Spazer": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Spazer.png", + "Spring Ball": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/SpringBall.png", + "Varia Suit": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Varia.png", + "Plasma Beam": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Plasma.png", + "Grappling Beam": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Grapple.png", + "Morph Ball": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Morph.png", + "Reserve Tank": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Reserve.png", + "Gravity Suit": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/Gravity.png", + "X-Ray Scope": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/XRayScope.png", + "Space Jump": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/SpaceJump.png", + "Screw Attack": "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/ScrewAttack.png", + "Nothing": "", + "No Energy": "", + "Kraid": "", + "Phantoon": "", + "Draygon": "", + "Ridley": "", + "Mother Brain": "", + } + multi_items = { + "Energy Tank": 83000, + "Missile": 83001, + "Super Missile": 83002, + "Power Bomb": 83003, + "Reserve Tank": 83020, + } -@app.route('/tracker//A Link to the Past') -@cache.memoize(timeout=60) # multisave is currently created at most every minute -def get_LttP_multiworld_tracker(tracker: UUID): - room: Room = Room.get(tracker=tracker) - if not room: - abort(404) - locations, names, use_door_tracker, seed_checks_in_area, player_location_to_area, \ - precollected_items, games, slot_data, groups, saving_second, custom_locations, custom_items = \ - get_static_room_data(room) + supermetroid_location_ids = { + 'Crateria/Blue Brinstar': [82005, 82007, 82008, 82026, 82029, + 82000, 82004, 82006, 82009, 82010, + 82011, 82012, 82027, 82028, 82034, + 82036, 82037], + 'Green/Pink Brinstar': [82017, 82023, 82030, 82033, 82035, + 82013, 82014, 82015, 82016, 82018, + 82019, 82021, 82022, 82024, 82025, + 82031], + 'Red Brinstar': [82038, 82042, 82039, 82040, 82041], + 'Kraid': [82043, 82048, 82044], + 'Norfair': [82050, 82053, 82061, 82066, 82068, + 82049, 82051, 82054, 82055, 82056, + 82062, 82063, 82064, 82065, 82067], + 'Lower Norfair': [82078, 82079, 82080, 82070, 82071, + 82073, 82074, 82075, 82076, 82077], + 'Crocomire': [82052, 82060, 82057, 82058, 82059], + 'Wrecked Ship': [82129, 82132, 82134, 82135, 82001, + 82002, 82003, 82128, 82130, 82131, + 82133], + 'West Maridia': [82138, 82136, 82137, 82139, 82140, + 82141, 82142], + 'East Maridia': [82143, 82145, 82150, 82152, 82154, + 82144, 82146, 82147, 82148, 82149, + 82151], + } - inventory = {teamnumber: {playernumber: collections.Counter() for playernumber in range(1, len(team) + 1) if - playernumber not in groups} - for teamnumber, team in enumerate(names)} + display_data = {} + inventory = tracker_data.get_player_inventory_counts(team, player) + + for item_name, item_id in multi_items.items(): + base_name = item_name.split()[0].lower() + display_data[base_name + "_count"] = inventory[item_id] + + # Victory condition + game_state = tracker_data.get_player_client_status(team, player) + display_data["game_finished"] = game_state == 30 + + # Turn location IDs into advancement tab counts + checked_locations = tracker_data.get_player_checked_locations(team, player) + lookup_name = lambda id: tracker_data.location_id_to_name["Super Metroid"][id] + location_info = {tab_name: {lookup_name(id): (id in checked_locations) for id in tab_locations} + for tab_name, tab_locations in supermetroid_location_ids.items()} + checks_done = {tab_name: len([id for id in tab_locations if id in checked_locations]) + for tab_name, tab_locations in supermetroid_location_ids.items()} + checks_done['Total'] = len(checked_locations) + checks_in_area = {tab_name: len(tab_locations) for tab_name, tab_locations in supermetroid_location_ids.items()} + checks_in_area['Total'] = sum(checks_in_area.values()) + + lookup_any_item_id_to_name = tracker_data.item_id_to_name["Super Metroid"] + return render_template( + "tracker__SuperMetroid.html", + inventory=inventory, + icons=icons, + acquired_items={lookup_any_item_id_to_name[id] for id, count in inventory.items() if count > 0}, + player=player, + team=team, + room=tracker_data.room, + player_name=tracker_data.get_player_name(team, player), + checks_done=checks_done, + checks_in_area=checks_in_area, + location_info=location_info, + **display_data, + ) - checks_done = {teamnumber: {playernumber: {loc_name: 0 for loc_name in default_locations} - for playernumber in range(1, len(team) + 1) if playernumber not in groups} - for teamnumber, team in enumerate(names)} + _player_trackers["Super Metroid"] = render_SuperMetroid_tracker - percent_total_checks_done = {teamnumber: {playernumber: 0 - for playernumber in range(1, len(team) + 1) if playernumber not in groups} - for teamnumber, team in enumerate(names)} +if "ChecksFinder" in network_data_package["games"]: + def render_ChecksFinder_tracker(tracker_data: TrackerData, team: int, player: int) -> str: + icons = { + "Checks Available": "https://0rganics.org/archipelago/cf/spr_tiles_3.png", + "Map Width": "https://0rganics.org/archipelago/cf/spr_tiles_4.png", + "Map Height": "https://0rganics.org/archipelago/cf/spr_tiles_5.png", + "Map Bombs": "https://0rganics.org/archipelago/cf/spr_tiles_6.png", - hints = {team: set() for team in range(len(names))} - if room.multisave: - multisave = restricted_loads(room.multisave) - else: - multisave = {} - if "hints" in multisave: - for (team, slot), slot_hints in multisave["hints"].items(): - hints[team] |= set(slot_hints) - - def attribute_item(team: int, recipient: int, item: int): - nonlocal inventory - target_item = links.get(item, item) - if item in levels: # non-progressive - inventory[team][recipient][target_item] = max(inventory[team][recipient][target_item], levels[item]) - else: - inventory[team][recipient][target_item] += 1 - - for (team, player), locations_checked in multisave.get("location_checks", {}).items(): - if player in groups: - continue - player_locations = locations[player] - if precollected_items: - precollected = precollected_items[player] - for item_id in precollected: - attribute_item(team, player, item_id) - for location in locations_checked: - if location not in player_locations or location not in player_location_to_area.get(player, {}): - continue - item, recipient, flags = player_locations[location] - recipients = groups.get(recipient, [recipient]) - for recipient in recipients: - attribute_item(team, recipient, item) - checks_done[team][player][player_location_to_area[player][location]] += 1 - checks_done[team][player]["Total"] = len(locations_checked) - - percent_total_checks_done[team][player] = ( - checks_done[team][player]["Total"] / len(player_locations) * 100 - if player_locations - else 100 + "Nothing": "", + } + + checksfinder_location_ids = { + "Tile 1": 81000, + "Tile 2": 81001, + "Tile 3": 81002, + "Tile 4": 81003, + "Tile 5": 81004, + "Tile 6": 81005, + "Tile 7": 81006, + "Tile 8": 81007, + "Tile 9": 81008, + "Tile 10": 81009, + "Tile 11": 81010, + "Tile 12": 81011, + "Tile 13": 81012, + "Tile 14": 81013, + "Tile 15": 81014, + "Tile 16": 81015, + "Tile 17": 81016, + "Tile 18": 81017, + "Tile 19": 81018, + "Tile 20": 81019, + "Tile 21": 81020, + "Tile 22": 81021, + "Tile 23": 81022, + "Tile 24": 81023, + "Tile 25": 81024, + } + + display_data = {} + inventory = tracker_data.get_player_inventory_counts(team, player) + locations = tracker_data.get_player_locations(team, player) + + # Multi-items + multi_items = { + "Map Width": 80000, + "Map Height": 80001, + "Map Bombs": 80002 + } + for item_name, item_id in multi_items.items(): + base_name = item_name.split()[-1].lower() + count = inventory[item_id] + display_data[base_name + "_count"] = count + display_data[base_name + "_display"] = count + 5 + + # Get location info + checked_locations = tracker_data.get_player_checked_locations(team, player) + lookup_name = lambda id: tracker_data.location_id_to_name["ChecksFinder"][id] + location_info = {tile_name: {lookup_name(tile_location): (tile_location in checked_locations)} for + tile_name, tile_location in checksfinder_location_ids.items() if + tile_location in set(locations)} + checks_done = {tile_name: len([tile_location]) for tile_name, tile_location in checksfinder_location_ids.items() + if tile_location in checked_locations and tile_location in set(locations)} + checks_done['Total'] = len(checked_locations) + checks_in_area = checks_done + + # Calculate checks available + display_data["checks_unlocked"] = min( + display_data["width_count"] + display_data["height_count"] + display_data["bombs_count"] + 5, 25) + display_data["checks_available"] = max(display_data["checks_unlocked"] - len(checked_locations), 0) + + # Victory condition + game_state = tracker_data.get_player_client_status(team, player) + display_data["game_finished"] = game_state == 30 + + lookup_any_item_id_to_name = tracker_data.item_id_to_name["ChecksFinder"] + return render_template( + "tracker__ChecksFinder.html", + inventory=inventory, icons=icons, + acquired_items={lookup_any_item_id_to_name[id] for id, count in inventory.items() if count > 0}, + player=player, + team=team, + room=tracker_data.room, + player_name=tracker_data.get_player_name(team, player), + checks_done=checks_done, + checks_in_area=checks_in_area, + location_info=location_info, + **display_data, ) - for (team, player), game_state in multisave.get("client_game_state", {}).items(): - if player in groups: - continue - if game_state == 30: - inventory[team][player][106] = 1 # Triforce + _player_trackers["ChecksFinder"] = render_ChecksFinder_tracker + +if "Starcraft 2 Wings of Liberty" in network_data_package["games"]: + def render_Starcraft2WingsOfLiberty_tracker(tracker_data: TrackerData, team: int, player: int) -> str: + SC2WOL_LOC_ID_OFFSET = 1000 + SC2WOL_ITEM_ID_OFFSET = 1000 + + icons = { + "Starting Minerals": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/icons/icon-mineral-protoss.png", + "Starting Vespene": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/icons/icon-gas-terran.png", + "Starting Supply": "https://static.wikia.nocookie.net/starcraft/images/d/d3/TerranSupply_SC2_Icon1.gif", + + "Infantry Weapons Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel1.png", + "Infantry Weapons Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel2.png", + "Infantry Weapons Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryweaponslevel3.png", + "Infantry Armor Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel1.png", + "Infantry Armor Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel2.png", + "Infantry Armor Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-infantryarmorlevel3.png", + "Vehicle Weapons Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel1.png", + "Vehicle Weapons Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel2.png", + "Vehicle Weapons Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleweaponslevel3.png", + "Vehicle Armor Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel1.png", + "Vehicle Armor Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel2.png", + "Vehicle Armor Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-vehicleplatinglevel3.png", + "Ship Weapons Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel1.png", + "Ship Weapons Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel2.png", + "Ship Weapons Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipweaponslevel3.png", + "Ship Armor Level 1": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel1.png", + "Ship Armor Level 2": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel2.png", + "Ship Armor Level 3": "https://sclegacy.com/images/uploaded/starcraftii_beta/gamefiles/upgrades/btn-upgrade-terran-shipplatinglevel3.png", + + "Bunker": "https://static.wikia.nocookie.net/starcraft/images/c/c5/Bunker_SC2_Icon1.jpg", + "Missile Turret": "https://static.wikia.nocookie.net/starcraft/images/5/5f/MissileTurret_SC2_Icon1.jpg", + "Sensor Tower": "https://static.wikia.nocookie.net/starcraft/images/d/d2/SensorTower_SC2_Icon1.jpg", + + "Projectile Accelerator (Bunker)": "https://0rganics.org/archipelago/sc2wol/ProjectileAccelerator.png", + "Neosteel Bunker (Bunker)": "https://0rganics.org/archipelago/sc2wol/NeosteelBunker.png", + "Titanium Housing (Missile Turret)": "https://0rganics.org/archipelago/sc2wol/TitaniumHousing.png", + "Hellstorm Batteries (Missile Turret)": "https://0rganics.org/archipelago/sc2wol/HellstormBatteries.png", + "Advanced Construction (SCV)": "https://0rganics.org/archipelago/sc2wol/AdvancedConstruction.png", + "Dual-Fusion Welders (SCV)": "https://0rganics.org/archipelago/sc2wol/Dual-FusionWelders.png", + "Fire-Suppression System (Building)": "https://0rganics.org/archipelago/sc2wol/Fire-SuppressionSystem.png", + "Orbital Command (Building)": "https://0rganics.org/archipelago/sc2wol/OrbitalCommandCampaign.png", + + "Marine": "https://static.wikia.nocookie.net/starcraft/images/4/47/Marine_SC2_Icon1.jpg", + "Medic": "https://static.wikia.nocookie.net/starcraft/images/7/74/Medic_SC2_Rend1.jpg", + "Firebat": "https://static.wikia.nocookie.net/starcraft/images/3/3c/Firebat_SC2_Rend1.jpg", + "Marauder": "https://static.wikia.nocookie.net/starcraft/images/b/ba/Marauder_SC2_Icon1.jpg", + "Reaper": "https://static.wikia.nocookie.net/starcraft/images/7/7d/Reaper_SC2_Icon1.jpg", + + "Stimpack (Marine)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", + "Super Stimpack (Marine)": "/static/static/icons/sc2/superstimpack.png", + "Combat Shield (Marine)": "https://0rganics.org/archipelago/sc2wol/CombatShieldCampaign.png", + "Laser Targeting System (Marine)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Magrail Munitions (Marine)": "/static/static/icons/sc2/magrailmunitions.png", + "Optimized Logistics (Marine)": "/static/static/icons/sc2/optimizedlogistics.png", + "Advanced Medic Facilities (Medic)": "https://0rganics.org/archipelago/sc2wol/AdvancedMedicFacilities.png", + "Stabilizer Medpacks (Medic)": "https://0rganics.org/archipelago/sc2wol/StabilizerMedpacks.png", + "Restoration (Medic)": "/static/static/icons/sc2/restoration.png", + "Optical Flare (Medic)": "/static/static/icons/sc2/opticalflare.png", + "Optimized Logistics (Medic)": "/static/static/icons/sc2/optimizedlogistics.png", + "Incinerator Gauntlets (Firebat)": "https://0rganics.org/archipelago/sc2wol/IncineratorGauntlets.png", + "Juggernaut Plating (Firebat)": "https://0rganics.org/archipelago/sc2wol/JuggernautPlating.png", + "Stimpack (Firebat)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", + "Super Stimpack (Firebat)": "/static/static/icons/sc2/superstimpack.png", + "Optimized Logistics (Firebat)": "/static/static/icons/sc2/optimizedlogistics.png", + "Concussive Shells (Marauder)": "https://0rganics.org/archipelago/sc2wol/ConcussiveShellsCampaign.png", + "Kinetic Foam (Marauder)": "https://0rganics.org/archipelago/sc2wol/KineticFoam.png", + "Stimpack (Marauder)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", + "Super Stimpack (Marauder)": "/static/static/icons/sc2/superstimpack.png", + "Laser Targeting System (Marauder)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Magrail Munitions (Marauder)": "/static/static/icons/sc2/magrailmunitions.png", + "Internal Tech Module (Marauder)": "/static/static/icons/sc2/internalizedtechmodule.png", + "U-238 Rounds (Reaper)": "https://0rganics.org/archipelago/sc2wol/U-238Rounds.png", + "G-4 Clusterbomb (Reaper)": "https://0rganics.org/archipelago/sc2wol/G-4Clusterbomb.png", + "Stimpack (Reaper)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", + "Super Stimpack (Reaper)": "/static/static/icons/sc2/superstimpack.png", + "Laser Targeting System (Reaper)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Advanced Cloaking Field (Reaper)": "/static/static/icons/sc2/terran-cloak-color.png", + "Spider Mines (Reaper)": "/static/static/icons/sc2/spidermine.png", + "Combat Drugs (Reaper)": "/static/static/icons/sc2/reapercombatdrugs.png", + + "Hellion": "https://static.wikia.nocookie.net/starcraft/images/5/56/Hellion_SC2_Icon1.jpg", + "Vulture": "https://static.wikia.nocookie.net/starcraft/images/d/da/Vulture_WoL.jpg", + "Goliath": "https://static.wikia.nocookie.net/starcraft/images/e/eb/Goliath_WoL.jpg", + "Diamondback": "https://static.wikia.nocookie.net/starcraft/images/a/a6/Diamondback_WoL.jpg", + "Siege Tank": "https://static.wikia.nocookie.net/starcraft/images/5/57/SiegeTank_SC2_Icon1.jpg", + + "Twin-Linked Flamethrower (Hellion)": "https://0rganics.org/archipelago/sc2wol/Twin-LinkedFlamethrower.png", + "Thermite Filaments (Hellion)": "https://0rganics.org/archipelago/sc2wol/ThermiteFilaments.png", + "Hellbat Aspect (Hellion)": "/static/static/icons/sc2/hellionbattlemode.png", + "Smart Servos (Hellion)": "/static/static/icons/sc2/transformationservos.png", + "Optimized Logistics (Hellion)": "/static/static/icons/sc2/optimizedlogistics.png", + "Jump Jets (Hellion)": "/static/static/icons/sc2/jumpjets.png", + "Stimpack (Hellion)": "https://0rganics.org/archipelago/sc2wol/StimpacksCampaign.png", + "Super Stimpack (Hellion)": "/static/static/icons/sc2/superstimpack.png", + "Cerberus Mine (Spider Mine)": "https://0rganics.org/archipelago/sc2wol/CerberusMine.png", + "High Explosive Munition (Spider Mine)": "/static/static/icons/sc2/high-explosive-spidermine.png", + "Replenishable Magazine (Vulture)": "https://0rganics.org/archipelago/sc2wol/ReplenishableMagazine.png", + "Ion Thrusters (Vulture)": "/static/static/icons/sc2/emergencythrusters.png", + "Auto Launchers (Vulture)": "/static/static/icons/sc2/jotunboosters.png", + "Multi-Lock Weapons System (Goliath)": "https://0rganics.org/archipelago/sc2wol/Multi-LockWeaponsSystem.png", + "Ares-Class Targeting System (Goliath)": "https://0rganics.org/archipelago/sc2wol/Ares-ClassTargetingSystem.png", + "Jump Jets (Goliath)": "/static/static/icons/sc2/jumpjets.png", + "Optimized Logistics (Goliath)": "/static/static/icons/sc2/optimizedlogistics.png", + "Tri-Lithium Power Cell (Diamondback)": "https://0rganics.org/archipelago/sc2wol/Tri-LithiumPowerCell.png", + "Shaped Hull (Diamondback)": "https://0rganics.org/archipelago/sc2wol/ShapedHull.png", + "Hyperfluxor (Diamondback)": "/static/static/icons/sc2/hyperfluxor.png", + "Burst Capacitors (Diamondback)": "/static/static/icons/sc2/burstcapacitors.png", + "Optimized Logistics (Diamondback)": "/static/static/icons/sc2/optimizedlogistics.png", + "Maelstrom Rounds (Siege Tank)": "https://0rganics.org/archipelago/sc2wol/MaelstromRounds.png", + "Shaped Blast (Siege Tank)": "https://0rganics.org/archipelago/sc2wol/ShapedBlast.png", + "Jump Jets (Siege Tank)": "/static/static/icons/sc2/jumpjets.png", + "Spider Mines (Siege Tank)": "/static/static/icons/sc2/siegetank-spidermines.png", + "Smart Servos (Siege Tank)": "/static/static/icons/sc2/transformationservos.png", + "Graduating Range (Siege Tank)": "/static/static/icons/sc2/siegetankrange.png", + "Laser Targeting System (Siege Tank)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Advanced Siege Tech (Siege Tank)": "/static/static/icons/sc2/improvedsiegemode.png", + "Internal Tech Module (Siege Tank)": "/static/static/icons/sc2/internalizedtechmodule.png", + + "Medivac": "https://static.wikia.nocookie.net/starcraft/images/d/db/Medivac_SC2_Icon1.jpg", + "Wraith": "https://static.wikia.nocookie.net/starcraft/images/7/75/Wraith_WoL.jpg", + "Viking": "https://static.wikia.nocookie.net/starcraft/images/2/2a/Viking_SC2_Icon1.jpg", + "Banshee": "https://static.wikia.nocookie.net/starcraft/images/3/32/Banshee_SC2_Icon1.jpg", + "Battlecruiser": "https://static.wikia.nocookie.net/starcraft/images/f/f5/Battlecruiser_SC2_Icon1.jpg", + + "Rapid Deployment Tube (Medivac)": "https://0rganics.org/archipelago/sc2wol/RapidDeploymentTube.png", + "Advanced Healing AI (Medivac)": "https://0rganics.org/archipelago/sc2wol/AdvancedHealingAI.png", + "Expanded Hull (Medivac)": "/static/static/icons/sc2/neosteelfortifiedarmor.png", + "Afterburners (Medivac)": "/static/static/icons/sc2/medivacemergencythrusters.png", + "Tomahawk Power Cells (Wraith)": "https://0rganics.org/archipelago/sc2wol/TomahawkPowerCells.png", + "Displacement Field (Wraith)": "https://0rganics.org/archipelago/sc2wol/DisplacementField.png", + "Advanced Laser Technology (Wraith)": "/static/static/icons/sc2/improvedburstlaser.png", + "Ripwave Missiles (Viking)": "https://0rganics.org/archipelago/sc2wol/RipwaveMissiles.png", + "Phobos-Class Weapons System (Viking)": "https://0rganics.org/archipelago/sc2wol/Phobos-ClassWeaponsSystem.png", + "Smart Servos (Viking)": "/static/static/icons/sc2/transformationservos.png", + "Magrail Munitions (Viking)": "/static/static/icons/sc2/magrailmunitions.png", + "Cross-Spectrum Dampeners (Banshee)": "/static/static/icons/sc2/crossspectrumdampeners.png", + "Advanced Cross-Spectrum Dampeners (Banshee)": "https://0rganics.org/archipelago/sc2wol/Cross-SpectrumDampeners.png", + "Shockwave Missile Battery (Banshee)": "https://0rganics.org/archipelago/sc2wol/ShockwaveMissileBattery.png", + "Hyperflight Rotors (Banshee)": "/static/static/icons/sc2/hyperflightrotors.png", + "Laser Targeting System (Banshee)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Internal Tech Module (Banshee)": "/static/static/icons/sc2/internalizedtechmodule.png", + "Missile Pods (Battlecruiser)": "https://0rganics.org/archipelago/sc2wol/MissilePods.png", + "Defensive Matrix (Battlecruiser)": "https://0rganics.org/archipelago/sc2wol/DefensiveMatrix.png", + "Tactical Jump (Battlecruiser)": "/static/static/icons/sc2/warpjump.png", + "Cloak (Battlecruiser)": "/static/static/icons/sc2/terran-cloak-color.png", + "ATX Laser Battery (Battlecruiser)": "/static/static/icons/sc2/specialordance.png", + "Optimized Logistics (Battlecruiser)": "/static/static/icons/sc2/optimizedlogistics.png", + "Internal Tech Module (Battlecruiser)": "/static/static/icons/sc2/internalizedtechmodule.png", + + "Ghost": "https://static.wikia.nocookie.net/starcraft/images/6/6e/Ghost_SC2_Icon1.jpg", + "Spectre": "https://static.wikia.nocookie.net/starcraft/images/0/0d/Spectre_WoL.jpg", + "Thor": "https://static.wikia.nocookie.net/starcraft/images/e/ef/Thor_SC2_Icon1.jpg", + + "Widow Mine": "/static/static/icons/sc2/widowmine.png", + "Cyclone": "/static/static/icons/sc2/cyclone.png", + "Liberator": "/static/static/icons/sc2/liberator.png", + "Valkyrie": "/static/static/icons/sc2/valkyrie.png", + + "Ocular Implants (Ghost)": "https://0rganics.org/archipelago/sc2wol/OcularImplants.png", + "Crius Suit (Ghost)": "https://0rganics.org/archipelago/sc2wol/CriusSuit.png", + "EMP Rounds (Ghost)": "/static/static/icons/sc2/terran-emp-color.png", + "Lockdown (Ghost)": "/static/static/icons/sc2/lockdown.png", + "Psionic Lash (Spectre)": "https://0rganics.org/archipelago/sc2wol/PsionicLash.png", + "Nyx-Class Cloaking Module (Spectre)": "https://0rganics.org/archipelago/sc2wol/Nyx-ClassCloakingModule.png", + "Impaler Rounds (Spectre)": "/static/static/icons/sc2/impalerrounds.png", + "330mm Barrage Cannon (Thor)": "https://0rganics.org/archipelago/sc2wol/330mmBarrageCannon.png", + "Immortality Protocol (Thor)": "https://0rganics.org/archipelago/sc2wol/ImmortalityProtocol.png", + "High Impact Payload (Thor)": "/static/static/icons/sc2/thorsiegemode.png", + "Smart Servos (Thor)": "/static/static/icons/sc2/transformationservos.png", + + "Optimized Logistics (Predator)": "/static/static/icons/sc2/optimizedlogistics.png", + "Drilling Claws (Widow Mine)": "/static/static/icons/sc2/drillingclaws.png", + "Concealment (Widow Mine)": "/static/static/icons/sc2/widowminehidden.png", + "Black Market Launchers (Widow Mine)": "/static/static/icons/sc2/widowmine-attackrange.png", + "Executioner Missiles (Widow Mine)": "/static/static/icons/sc2/widowmine-deathblossom.png", + "Mag-Field Accelerators (Cyclone)": "/static/static/icons/sc2/magfieldaccelerator.png", + "Mag-Field Launchers (Cyclone)": "/static/static/icons/sc2/cyclonerangeupgrade.png", + "Targeting Optics (Cyclone)": "/static/static/icons/sc2/targetingoptics.png", + "Rapid Fire Launchers (Cyclone)": "/static/static/icons/sc2/ripwavemissiles.png", + "Bio Mechanical Repair Drone (Raven)": "/static/static/icons/sc2/biomechanicaldrone.png", + "Spider Mines (Raven)": "/static/static/icons/sc2/siegetank-spidermines.png", + "Railgun Turret (Raven)": "/static/static/icons/sc2/autoturretblackops.png", + "Hunter-Seeker Weapon (Raven)": "/static/static/icons/sc2/specialordance.png", + "Interference Matrix (Raven)": "/static/static/icons/sc2/interferencematrix.png", + "Anti-Armor Missile (Raven)": "/static/static/icons/sc2/shreddermissile.png", + "Internal Tech Module (Raven)": "/static/static/icons/sc2/internalizedtechmodule.png", + "EMP Shockwave (Science Vessel)": "/static/static/icons/sc2/staticempblast.png", + "Defensive Matrix (Science Vessel)": "https://0rganics.org/archipelago/sc2wol/DefensiveMatrix.png", + "Advanced Ballistics (Liberator)": "/static/static/icons/sc2/advanceballistics.png", + "Raid Artillery (Liberator)": "/static/static/icons/sc2/terrandefendermodestructureattack.png", + "Cloak (Liberator)": "/static/static/icons/sc2/terran-cloak-color.png", + "Laser Targeting System (Liberator)": "/static/static/icons/sc2/lasertargetingsystem.png", + "Optimized Logistics (Liberator)": "/static/static/icons/sc2/optimizedlogistics.png", + "Enhanced Cluster Launchers (Valkyrie)": "https://0rganics.org/archipelago/sc2wol/HellstormBatteries.png", + "Shaped Hull (Valkyrie)": "https://0rganics.org/archipelago/sc2wol/ShapedHull.png", + "Burst Lasers (Valkyrie)": "/static/static/icons/sc2/improvedburstlaser.png", + "Afterburners (Valkyrie)": "/static/static/icons/sc2/medivacemergencythrusters.png", + + "War Pigs": "https://static.wikia.nocookie.net/starcraft/images/e/ed/WarPigs_SC2_Icon1.jpg", + "Devil Dogs": "https://static.wikia.nocookie.net/starcraft/images/3/33/DevilDogs_SC2_Icon1.jpg", + "Hammer Securities": "https://static.wikia.nocookie.net/starcraft/images/3/3b/HammerSecurity_SC2_Icon1.jpg", + "Spartan Company": "https://static.wikia.nocookie.net/starcraft/images/b/be/SpartanCompany_SC2_Icon1.jpg", + "Siege Breakers": "https://static.wikia.nocookie.net/starcraft/images/3/31/SiegeBreakers_SC2_Icon1.jpg", + "Hel's Angel": "https://static.wikia.nocookie.net/starcraft/images/6/63/HelsAngels_SC2_Icon1.jpg", + "Dusk Wings": "https://static.wikia.nocookie.net/starcraft/images/5/52/DuskWings_SC2_Icon1.jpg", + "Jackson's Revenge": "https://static.wikia.nocookie.net/starcraft/images/9/95/JacksonsRevenge_SC2_Icon1.jpg", + + "Ultra-Capacitors": "https://static.wikia.nocookie.net/starcraft/images/2/23/SC2_Lab_Ultra_Capacitors_Icon.png", + "Vanadium Plating": "https://static.wikia.nocookie.net/starcraft/images/6/67/SC2_Lab_VanPlating_Icon.png", + "Orbital Depots": "https://static.wikia.nocookie.net/starcraft/images/0/01/SC2_Lab_Orbital_Depot_Icon.png", + "Micro-Filtering": "https://static.wikia.nocookie.net/starcraft/images/2/20/SC2_Lab_MicroFilter_Icon.png", + "Automated Refinery": "https://static.wikia.nocookie.net/starcraft/images/7/71/SC2_Lab_Auto_Refinery_Icon.png", + "Command Center Reactor": "https://static.wikia.nocookie.net/starcraft/images/e/ef/SC2_Lab_CC_Reactor_Icon.png", + "Raven": "https://static.wikia.nocookie.net/starcraft/images/1/19/SC2_Lab_Raven_Icon.png", + "Science Vessel": "https://static.wikia.nocookie.net/starcraft/images/c/c3/SC2_Lab_SciVes_Icon.png", + "Tech Reactor": "https://static.wikia.nocookie.net/starcraft/images/c/c5/SC2_Lab_Tech_Reactor_Icon.png", + "Orbital Strike": "https://static.wikia.nocookie.net/starcraft/images/d/df/SC2_Lab_Orb_Strike_Icon.png", + + "Shrike Turret (Bunker)": "https://static.wikia.nocookie.net/starcraft/images/4/44/SC2_Lab_Shrike_Turret_Icon.png", + "Fortified Bunker (Bunker)": "https://static.wikia.nocookie.net/starcraft/images/4/4f/SC2_Lab_FortBunker_Icon.png", + "Planetary Fortress": "https://static.wikia.nocookie.net/starcraft/images/0/0b/SC2_Lab_PlanetFortress_Icon.png", + "Perdition Turret": "https://static.wikia.nocookie.net/starcraft/images/a/af/SC2_Lab_PerdTurret_Icon.png", + "Predator": "https://static.wikia.nocookie.net/starcraft/images/8/83/SC2_Lab_Predator_Icon.png", + "Hercules": "https://static.wikia.nocookie.net/starcraft/images/4/40/SC2_Lab_Hercules_Icon.png", + "Cellular Reactor": "https://static.wikia.nocookie.net/starcraft/images/d/d8/SC2_Lab_CellReactor_Icon.png", + "Regenerative Bio-Steel Level 1": "/static/static/icons/sc2/SC2_Lab_BioSteel_L1.png", + "Regenerative Bio-Steel Level 2": "/static/static/icons/sc2/SC2_Lab_BioSteel_L2.png", + "Hive Mind Emulator": "https://static.wikia.nocookie.net/starcraft/images/b/bc/SC2_Lab_Hive_Emulator_Icon.png", + "Psi Disrupter": "https://static.wikia.nocookie.net/starcraft/images/c/cf/SC2_Lab_Psi_Disruptor_Icon.png", + + "Zealot": "https://static.wikia.nocookie.net/starcraft/images/6/6e/Icon_Protoss_Zealot.jpg", + "Stalker": "https://static.wikia.nocookie.net/starcraft/images/0/0d/Icon_Protoss_Stalker.jpg", + "High Templar": "https://static.wikia.nocookie.net/starcraft/images/a/a0/Icon_Protoss_High_Templar.jpg", + "Dark Templar": "https://static.wikia.nocookie.net/starcraft/images/9/90/Icon_Protoss_Dark_Templar.jpg", + "Immortal": "https://static.wikia.nocookie.net/starcraft/images/c/c1/Icon_Protoss_Immortal.jpg", + "Colossus": "https://static.wikia.nocookie.net/starcraft/images/4/40/Icon_Protoss_Colossus.jpg", + "Phoenix": "https://static.wikia.nocookie.net/starcraft/images/b/b1/Icon_Protoss_Phoenix.jpg", + "Void Ray": "https://static.wikia.nocookie.net/starcraft/images/1/1d/VoidRay_SC2_Rend1.jpg", + "Carrier": "https://static.wikia.nocookie.net/starcraft/images/2/2c/Icon_Protoss_Carrier.jpg", + + "Nothing": "", + } + sc2wol_location_ids = { + "Liberation Day": range(SC2WOL_LOC_ID_OFFSET + 100, SC2WOL_LOC_ID_OFFSET + 200), + "The Outlaws": range(SC2WOL_LOC_ID_OFFSET + 200, SC2WOL_LOC_ID_OFFSET + 300), + "Zero Hour": range(SC2WOL_LOC_ID_OFFSET + 300, SC2WOL_LOC_ID_OFFSET + 400), + "Evacuation": range(SC2WOL_LOC_ID_OFFSET + 400, SC2WOL_LOC_ID_OFFSET + 500), + "Outbreak": range(SC2WOL_LOC_ID_OFFSET + 500, SC2WOL_LOC_ID_OFFSET + 600), + "Safe Haven": range(SC2WOL_LOC_ID_OFFSET + 600, SC2WOL_LOC_ID_OFFSET + 700), + "Haven's Fall": range(SC2WOL_LOC_ID_OFFSET + 700, SC2WOL_LOC_ID_OFFSET + 800), + "Smash and Grab": range(SC2WOL_LOC_ID_OFFSET + 800, SC2WOL_LOC_ID_OFFSET + 900), + "The Dig": range(SC2WOL_LOC_ID_OFFSET + 900, SC2WOL_LOC_ID_OFFSET + 1000), + "The Moebius Factor": range(SC2WOL_LOC_ID_OFFSET + 1000, SC2WOL_LOC_ID_OFFSET + 1100), + "Supernova": range(SC2WOL_LOC_ID_OFFSET + 1100, SC2WOL_LOC_ID_OFFSET + 1200), + "Maw of the Void": range(SC2WOL_LOC_ID_OFFSET + 1200, SC2WOL_LOC_ID_OFFSET + 1300), + "Devil's Playground": range(SC2WOL_LOC_ID_OFFSET + 1300, SC2WOL_LOC_ID_OFFSET + 1400), + "Welcome to the Jungle": range(SC2WOL_LOC_ID_OFFSET + 1400, SC2WOL_LOC_ID_OFFSET + 1500), + "Breakout": range(SC2WOL_LOC_ID_OFFSET + 1500, SC2WOL_LOC_ID_OFFSET + 1600), + "Ghost of a Chance": range(SC2WOL_LOC_ID_OFFSET + 1600, SC2WOL_LOC_ID_OFFSET + 1700), + "The Great Train Robbery": range(SC2WOL_LOC_ID_OFFSET + 1700, SC2WOL_LOC_ID_OFFSET + 1800), + "Cutthroat": range(SC2WOL_LOC_ID_OFFSET + 1800, SC2WOL_LOC_ID_OFFSET + 1900), + "Engine of Destruction": range(SC2WOL_LOC_ID_OFFSET + 1900, SC2WOL_LOC_ID_OFFSET + 2000), + "Media Blitz": range(SC2WOL_LOC_ID_OFFSET + 2000, SC2WOL_LOC_ID_OFFSET + 2100), + "Piercing the Shroud": range(SC2WOL_LOC_ID_OFFSET + 2100, SC2WOL_LOC_ID_OFFSET + 2200), + "Whispers of Doom": range(SC2WOL_LOC_ID_OFFSET + 2200, SC2WOL_LOC_ID_OFFSET + 2300), + "A Sinister Turn": range(SC2WOL_LOC_ID_OFFSET + 2300, SC2WOL_LOC_ID_OFFSET + 2400), + "Echoes of the Future": range(SC2WOL_LOC_ID_OFFSET + 2400, SC2WOL_LOC_ID_OFFSET + 2500), + "In Utter Darkness": range(SC2WOL_LOC_ID_OFFSET + 2500, SC2WOL_LOC_ID_OFFSET + 2600), + "Gates of Hell": range(SC2WOL_LOC_ID_OFFSET + 2600, SC2WOL_LOC_ID_OFFSET + 2700), + "Belly of the Beast": range(SC2WOL_LOC_ID_OFFSET + 2700, SC2WOL_LOC_ID_OFFSET + 2800), + "Shatter the Sky": range(SC2WOL_LOC_ID_OFFSET + 2800, SC2WOL_LOC_ID_OFFSET + 2900), + } - player_big_key_locations = {playernumber: set() for playernumber in range(1, len(names[0]) + 1)} - player_small_key_locations = {playernumber: set() for playernumber in range(1, len(names[0]) + 1)} - for loc_data in locations.values(): - for values in loc_data.values(): - item_id, item_player, flags = values + display_data = {} - if item_id in ids_big_key: - player_big_key_locations[item_player].add(ids_big_key[item_id]) - elif item_id in ids_small_key: - player_small_key_locations[item_player].add(ids_small_key[item_id]) - group_big_key_locations = set() - group_key_locations = set() - for player in [player for player in range(1, len(names[0]) + 1) if player not in groups]: - group_key_locations |= player_small_key_locations[player] - group_big_key_locations |= player_big_key_locations[player] - - activity_timers = {} - now = datetime.datetime.utcnow() - for (team, player), timestamp in multisave.get("client_activity_timers", []): - activity_timers[team, player] = now - datetime.datetime.utcfromtimestamp(timestamp) - - player_names = {} - for team, names in enumerate(names): - for player, name in enumerate(names, 1): - player_names[(team, player)] = name - long_player_names = player_names.copy() - for (team, player), alias in multisave.get("name_aliases", {}).items(): - player_names[(team, player)] = alias - long_player_names[(team, player)] = f"{alias} ({long_player_names[(team, player)]})" - - video = {} - for (team, player), data in multisave.get("video", []): - video[(team, player)] = data - - enabled_multiworld_trackers = get_enabled_multiworld_trackers(room, "A Link to the Past") - - return render_template("lttpMultiTracker.html", inventory=inventory, get_item_name_from_id=lookup_any_item_id_to_name, - lookup_id_to_name=Items.lookup_id_to_name, player_names=player_names, - tracking_names=tracking_names, tracking_ids=tracking_ids, room=room, icons=alttp_icons, - multi_items=multi_items, checks_done=checks_done, - percent_total_checks_done=percent_total_checks_done, - ordered_areas=ordered_areas, checks_in_area=seed_checks_in_area, - activity_timers=activity_timers, - key_locations=group_key_locations, small_key_ids=small_key_ids, big_key_ids=big_key_ids, - video=video, big_key_locations=group_big_key_locations, - hints=hints, long_player_names=long_player_names, - enabled_multiworld_trackers=enabled_multiworld_trackers) - - -game_specific_trackers: typing.Dict[str, typing.Callable] = { - "Minecraft": __renderMinecraftTracker, - "Ocarina of Time": __renderOoTTracker, - "Timespinner": __renderTimespinnerTracker, - "A Link to the Past": __renderAlttpTracker, - "ChecksFinder": __renderChecksfinder, - "Super Metroid": __renderSuperMetroidTracker, - "Starcraft 2": __renderSC2WoLTracker -} - -multi_trackers: typing.Dict[str, typing.Callable] = { - "A Link to the Past": get_LttP_multiworld_tracker, -} - -if "Factorio" in games: - multi_trackers["Factorio"] = get_Factorio_multiworld_tracker + # Grouped Items + grouped_item_ids = { + "Progressive Weapon Upgrade": 107 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Armor Upgrade": 108 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Infantry Upgrade": 109 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Vehicle Upgrade": 110 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Ship Upgrade": 111 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Weapon/Armor Upgrade": 112 + SC2WOL_ITEM_ID_OFFSET + } + grouped_item_replacements = { + "Progressive Weapon Upgrade": ["Progressive Infantry Weapon", "Progressive Vehicle Weapon", + "Progressive Ship Weapon"], + "Progressive Armor Upgrade": ["Progressive Infantry Armor", "Progressive Vehicle Armor", + "Progressive Ship Armor"], + "Progressive Infantry Upgrade": ["Progressive Infantry Weapon", "Progressive Infantry Armor"], + "Progressive Vehicle Upgrade": ["Progressive Vehicle Weapon", "Progressive Vehicle Armor"], + "Progressive Ship Upgrade": ["Progressive Ship Weapon", "Progressive Ship Armor"] + } + grouped_item_replacements["Progressive Weapon/Armor Upgrade"] = grouped_item_replacements[ + "Progressive Weapon Upgrade"] + \ + grouped_item_replacements[ + "Progressive Armor Upgrade"] + replacement_item_ids = { + "Progressive Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Infantry Armor": 102 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET, + } + + inventory = tracker_data.get_player_inventory_counts(team, player) + for grouped_item_name, grouped_item_id in grouped_item_ids.items(): + count: int = inventory[grouped_item_id] + if count > 0: + for replacement_item in grouped_item_replacements[grouped_item_name]: + replacement_id: int = replacement_item_ids[replacement_item] + inventory[replacement_id] = count + + # Determine display for progressive items + progressive_items = { + "Progressive Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Infantry Armor": 102 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Stimpack (Marine)": 208 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Stimpack (Firebat)": 226 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Stimpack (Marauder)": 228 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Stimpack (Reaper)": 250 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Stimpack (Hellion)": 259 + SC2WOL_ITEM_ID_OFFSET, + "Progressive High Impact Payload (Thor)": 361 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Cross-Spectrum Dampeners (Banshee)": 316 + SC2WOL_ITEM_ID_OFFSET, + "Progressive Regenerative Bio-Steel": 617 + SC2WOL_ITEM_ID_OFFSET + } + progressive_names = { + "Progressive Infantry Weapon": ["Infantry Weapons Level 1", "Infantry Weapons Level 1", + "Infantry Weapons Level 2", "Infantry Weapons Level 3"], + "Progressive Infantry Armor": ["Infantry Armor Level 1", "Infantry Armor Level 1", + "Infantry Armor Level 2", "Infantry Armor Level 3"], + "Progressive Vehicle Weapon": ["Vehicle Weapons Level 1", "Vehicle Weapons Level 1", + "Vehicle Weapons Level 2", "Vehicle Weapons Level 3"], + "Progressive Vehicle Armor": ["Vehicle Armor Level 1", "Vehicle Armor Level 1", + "Vehicle Armor Level 2", "Vehicle Armor Level 3"], + "Progressive Ship Weapon": ["Ship Weapons Level 1", "Ship Weapons Level 1", + "Ship Weapons Level 2", "Ship Weapons Level 3"], + "Progressive Ship Armor": ["Ship Armor Level 1", "Ship Armor Level 1", + "Ship Armor Level 2", "Ship Armor Level 3"], + "Progressive Stimpack (Marine)": ["Stimpack (Marine)", "Stimpack (Marine)", + "Super Stimpack (Marine)"], + "Progressive Stimpack (Firebat)": ["Stimpack (Firebat)", "Stimpack (Firebat)", + "Super Stimpack (Firebat)"], + "Progressive Stimpack (Marauder)": ["Stimpack (Marauder)", "Stimpack (Marauder)", + "Super Stimpack (Marauder)"], + "Progressive Stimpack (Reaper)": ["Stimpack (Reaper)", "Stimpack (Reaper)", + "Super Stimpack (Reaper)"], + "Progressive Stimpack (Hellion)": ["Stimpack (Hellion)", "Stimpack (Hellion)", + "Super Stimpack (Hellion)"], + "Progressive High Impact Payload (Thor)": ["High Impact Payload (Thor)", + "High Impact Payload (Thor)", "Smart Servos (Thor)"], + "Progressive Cross-Spectrum Dampeners (Banshee)": ["Cross-Spectrum Dampeners (Banshee)", + "Cross-Spectrum Dampeners (Banshee)", + "Advanced Cross-Spectrum Dampeners (Banshee)"], + "Progressive Regenerative Bio-Steel": ["Regenerative Bio-Steel Level 1", + "Regenerative Bio-Steel Level 1", + "Regenerative Bio-Steel Level 2"] + } + for item_name, item_id in progressive_items.items(): + level = min(inventory[item_id], len(progressive_names[item_name]) - 1) + display_name = progressive_names[item_name][level] + base_name = (item_name.split(maxsplit=1)[1].lower() + .replace(' ', '_') + .replace("-", "") + .replace("(", "") + .replace(")", "")) + display_data[base_name + "_level"] = level + display_data[base_name + "_url"] = icons[display_name] + display_data[base_name + "_name"] = display_name + + # Multi-items + multi_items = { + "+15 Starting Minerals": 800 + SC2WOL_ITEM_ID_OFFSET, + "+15 Starting Vespene": 801 + SC2WOL_ITEM_ID_OFFSET, + "+2 Starting Supply": 802 + SC2WOL_ITEM_ID_OFFSET + } + for item_name, item_id in multi_items.items(): + base_name = item_name.split()[-1].lower() + count = inventory[item_id] + if base_name == "supply": + count = count * 2 + display_data[base_name + "_count"] = count + else: + count = count * 15 + display_data[base_name + "_count"] = count + + # Victory condition + game_state = tracker_data.get_player_client_status(team, player) + display_data["game_finished"] = game_state == 30 + + # Turn location IDs into mission objective counts + locations = tracker_data.get_player_locations(team, player) + checked_locations = tracker_data.get_player_checked_locations(team, player) + lookup_name = lambda id: tracker_data.location_id_to_name["Starcraft 2 Wings of Liberty"][id] + location_info = {mission_name: {lookup_name(id): (id in checked_locations) for id in mission_locations if + id in set(locations)} for mission_name, mission_locations in + sc2wol_location_ids.items()} + checks_done = {mission_name: len( + [id for id in mission_locations if id in checked_locations and id in set(locations)]) for + mission_name, mission_locations in sc2wol_location_ids.items()} + checks_done['Total'] = len(checked_locations) + checks_in_area = {mission_name: len([id for id in mission_locations if id in set(locations)]) for + mission_name, mission_locations in sc2wol_location_ids.items()} + checks_in_area['Total'] = sum(checks_in_area.values()) + + lookup_any_item_id_to_name = tracker_data.item_id_to_name["Starcraft 2 Wings of Liberty"] + return render_template( + "tracker__Starcraft2WingsOfLiberty.html", + inventory=inventory, + icons=icons, + acquired_items={lookup_any_item_id_to_name[id] for id, count in inventory.items() if count > 0}, + player=player, + team=team, + room=tracker_data.room, + player_name=tracker_data.get_player_name(team, player), + checks_done=checks_done, + checks_in_area=checks_in_area, + location_info=location_info, + **display_data, + ) + + _player_trackers["Starcraft 2"] = render_Starcraft2WingsOfLiberty_tracker diff --git a/data/client.kv b/data/client.kv index f0e36169002a..3b48d216ddb3 100644 --- a/data/client.kv +++ b/data/client.kv @@ -17,6 +17,12 @@ color: "FFFFFF" : tab_width: root.width / app.tab_count +: + text_size: self.width, None + size_hint_y: None + height: self.texture_size[1] + font_size: dp(20) + markup: True : canvas.before: Color: @@ -24,11 +30,6 @@ Rectangle: size: self.size pos: self.pos - text_size: self.width, None - size_hint_y: None - height: self.texture_size[1] - font_size: dp(20) - markup: True : messages: 1000 # amount of messages stored in client logs. cols: 1 @@ -44,6 +45,70 @@ height: self.minimum_height orientation: 'vertical' spacing: dp(3) +: + canvas.before: + Color: + rgba: (.0, 0.9, .1, .3) if self.selected else (0.2, 0.2, 0.2, 1) if self.striped else (0.18, 0.18, 0.18, 1) + Rectangle: + size: self.size + pos: self.pos + height: self.minimum_height + receiving_text: "Receiving Player" + item_text: "Item" + finding_text: "Finding Player" + location_text: "Location" + entrance_text: "Entrance" + found_text: "Found?" + TooltipLabel: + id: receiving + text: root.receiving_text + halign: 'center' + valign: 'center' + pos_hint: {"center_y": 0.5} + TooltipLabel: + id: item + text: root.item_text + halign: 'center' + valign: 'center' + pos_hint: {"center_y": 0.5} + TooltipLabel: + id: finding + text: root.finding_text + halign: 'center' + valign: 'center' + pos_hint: {"center_y": 0.5} + TooltipLabel: + id: location + text: root.location_text + halign: 'center' + valign: 'center' + pos_hint: {"center_y": 0.5} + TooltipLabel: + id: entrance + text: root.entrance_text + halign: 'center' + valign: 'center' + pos_hint: {"center_y": 0.5} + TooltipLabel: + id: found + text: root.found_text + halign: 'center' + valign: 'center' + pos_hint: {"center_y": 0.5} +: + cols: 1 + viewclass: 'HintLabel' + scroll_y: self.height + scroll_type: ["content", "bars"] + bar_width: dp(12) + effect_cls: "ScrollEffect" + SelectableRecycleBoxLayout: + default_size: None, dp(20) + default_size_hint: 1, None + size_hint_y: None + height: self.minimum_height + orientation: 'vertical' + spacing: dp(3) : text: "Server:" size_hint_x: None diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index a506c29a3a6d..f99971a29d2a 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -61,6 +61,9 @@ # Kingdom Hearts 2 /worlds/kh2/ @JaredWeakStrike +# Lingo +/worlds/lingo/ @hatkirby + # Links Awakening DX /worlds/ladx/ @zig-for @@ -92,6 +95,9 @@ # Overcooked! 2 /worlds/overcooked2/ @toasterparty +# Pokemon Emerald +/worlds/pokemon_emerald/ @Zunawe + # Pokemon Red and Blue /worlds/pokemon_rb/ @Alchav diff --git a/docs/apworld specification.md b/docs/apworld specification.md index 98cd25a73032..ed2e8b1c8ecb 100644 --- a/docs/apworld specification.md +++ b/docs/apworld specification.md @@ -29,6 +29,7 @@ The zip can contain arbitrary files in addition what was specified above. ## Caveats -Imports from other files inside the apworld have to use relative imports. +Imports from other files inside the apworld have to use relative imports. e.g. `from .options import MyGameOptions` -Imports from AP base have to use absolute imports, e.g. Options.py and worlds/AutoWorld.py. +Imports from AP base have to use absolute imports, e.g. `from Options import Toggle` or +`from worlds.AutoWorld import World` diff --git a/docs/contributing.md b/docs/contributing.md index 4f7af029cce8..6fd80fe86ee4 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -1,16 +1,33 @@ # Contributing -Contributions are welcome. We have a few requests of any new contributors. +Contributions are welcome. We have a few requests for new contributors: -* Follow styling as designated in our [styling documentation](/docs/style.md). -* Ensure that all changes which affect logic are covered by unit tests. -* Do not introduce any unit test failures/regressions. -* Turn on automated github actions in your fork to have github run all the unit tests after pushing. See example below: +* **Follow styling guidelines.** + Please take a look at the [code style documentation](/docs/style.md) + to ensure ease of communication and uniformity. + +* **Ensure that critical changes are covered by tests.** +It is strongly recommended that unit tests are used to avoid regression and to ensure everything is still working. +If you wish to contribute by adding a new game, please take a look at the [logic unit test documentation](/docs/world%20api.md#tests). +If you wish to contribute to the website, please take a look at [these tests](/test/webhost). + +* **Do not introduce unit test failures/regressions.** +Archipelago supports multiple versions of Python. You may need to download older Python versions to fully test +your changes. Currently, the oldest supported version is [Python 3.8](https://www.python.org/downloads/release/python-380/). +It is recommended that automated github actions are turned on in your fork to have github run all of the unit tests after pushing. +You can turn them on here: ![Github actions example](./img/github-actions-example.png) -Otherwise, we tend to judge code on a case to case basis. +Other than these requests, we tend to judge code on a case by case basis. + +For contribution to the website, please refer to the [WebHost README](/WebHostLib/README.md). + +If you want to contribute to the core, you will be subject to stricter review on your pull requests. It is recommended +that you get in touch with other core maintainers via the [Discord](https://archipelago.gg/discord). + +If you want to add Archipelago support for a new game, please take a look at the [adding games documentation](/docs/adding%20games.md), which details what is required +to implement support for a game, as well as tips for how to get started. +If you want to merge a new game into the main Archipelago repo, please make sure to read the responsibilities as a +[world maintainer](/docs/world%20maintainer.md). -For adding a new game to Archipelago and other documentation on how Archipelago functions, please see -[the docs folder](/docs/) for the relevant information and feel free to ask any questions in the #archipelago-dev -channel in our [Discord](https://archipelago.gg/discord). -If you want to merge a new game, please make sure to read the responsibilities as -[world maintainer](/docs/world%20maintainer.md). +For other questions, feel free to explore the [main documentation folder](/docs/) and ask us questions in the #archipelago-dev channel +of the [Discord](https://archipelago.gg/discord). diff --git a/docs/options api.md b/docs/options api.md index 2c86833800c7..622d0a7ec79f 100644 --- a/docs/options api.md +++ b/docs/options api.md @@ -31,7 +31,7 @@ As an example, suppose we want an option that lets the user start their game wit create our option class (with a docstring), give it a `display_name`, and add it to our game's options dataclass: ```python -# Options.py +# options.py from dataclasses import dataclass from Options import Toggle, PerGameCommonOptions diff --git a/docs/world api.md b/docs/world api.md index b128e2b146b4..4008c9c4dddf 100644 --- a/docs/world api.md +++ b/docs/world api.md @@ -73,6 +73,53 @@ for your world specifically on the webhost: `game_info_languages` (optional) List of strings for defining the existing gameinfo pages your game supports. The documents must be prefixed with the same string as defined here. Default already has 'en'. +`options_presets` (optional) A `Dict[str, Dict[str, Any]]` where the keys are the names of the presets and the values +are the options to be set for that preset. The options are defined as a `Dict[str, Any]` where the keys are the names of +the options and the values are the values to be set for that option. These presets will be available for users to select from on the game's options page. + +Note: The values must be a non-aliased value for the option type and can only include the following option types: + + - If you have a `Range`/`SpecialRange` option, the value should be an `int` between the `range_start` and `range_end` + values. + - If you have a `SpecialRange` option, the value can alternatively be a `str` that is one of the + `special_range_names` keys. + - If you have a `Choice` option, the value should be a `str` that is one of the `option_` values. + - If you have a `Toggle`/`DefaultOnToggle` option, the value should be a `bool`. + - `random` is also a valid value for any of these option types. + +`OptionDict`, `OptionList`, `OptionSet`, `FreeText`, or custom `Option`-derived classes are not supported for presets on the webhost at this time. + +Here is an example of a defined preset: +```python +# presets.py +options_presets = { + "Limited Potential": { + "progression_balancing": 0, + "fairy_chests_per_zone": 2, + "starting_class": "random", + "chests_per_zone": 30, + "vendors": "normal", + "architect": "disabled", + "gold_gain_multiplier": "half", + "number_of_children": 2, + "free_diary_on_generation": False, + "health_pool": 10, + "mana_pool": 10, + "attack_pool": 10, + "magic_damage_pool": 10, + "armor_pool": 5, + "equip_pool": 10, + "crit_chance_pool": 5, + "crit_damage_pool": 5, + } +} + +# __init__.py +class RLWeb(WebWorld): + options_presets = options_presets + # ... +``` + ### MultiWorld Object The `MultiWorld` object references the whole multiworld (all items and locations @@ -121,6 +168,38 @@ Classification is one of `LocationProgressType.DEFAULT`, `PRIORITY` or `EXCLUDED The Fill algorithm will force progression items to be placed at priority locations, giving a higher chance of them being required, and will prevent progression and useful items from being placed at excluded locations. +#### Documenting Locations + +Worlds can optionally provide a `location_descriptions` map which contains +human-friendly descriptions of locations or location groups. These descriptions +will show up in location-selection options in the Weighted Options page. Extra +indentation and single newlines will be collapsed into spaces. + +```python +# Locations.py + +location_descriptions = { + "Red Potion #6": "In a secret destructible block under the second stairway", + "L2 Spaceship": """ + The group of all items in the spaceship in Level 2. + + This doesn't include the item on the spaceship door, since it can be + accessed without the Spaeship Key. + """ +} +``` + +```python +# __init__.py + +from worlds.AutoWorld import World +from .Locations import location_descriptions + + +class MyGameWorld(World): + location_descriptions = location_descriptions +``` + ### Items Items are all things that can "drop" for your game. This may be RPG items like @@ -147,6 +226,37 @@ Other classifications include * `progression_skip_balancing`: the combination of `progression` and `skip_balancing`, i.e., a progression item that will not be moved around by progression balancing; used, e.g., for currency or tokens +#### Documenting Items + +Worlds can optionally provide an `item_descriptions` map which contains +human-friendly descriptions of items or item groups. These descriptions will +show up in item-selection options in the Weighted Options page. Extra +indentation and single newlines will be collapsed into spaces. + +```python +# Items.py + +item_descriptions = { + "Red Potion": "A standard health potion", + "Spaceship Key": """ + The key to the spaceship in Level 2. + + This is necessary to get to the Star Realm. + """ +} +``` + +```python +# __init__.py + +from worlds.AutoWorld import World +from .Items import item_descriptions + + +class MyGameWorld(World): + item_descriptions = item_descriptions +``` + ### Events Events will mark some progress. You define an event location, an @@ -223,11 +333,11 @@ See [pip documentation](https://pip.pypa.io/en/stable/cli/pip_install/#requireme AP will only import the `__init__.py`. Depending on code size it makes sense to use multiple files and use relative imports to access them. -e.g. `from .Options import MyGameOptions` from your `__init__.py` will load -`world/[world_name]/Options.py` and make its `MyGameOptions` accessible. +e.g. `from .options import MyGameOptions` from your `__init__.py` will load +`world/[world_name]/options.py` and make its `MyGameOptions` accessible. -When imported names pile up it may be easier to use `from . import Options` -and access the variable as `Options.MyGameOptions`. +When imported names pile up it may be easier to use `from . import options` +and access the variable as `options.MyGameOptions`. Imports from directories outside your world should use absolute imports. Correct use of relative / absolute imports is required for zipped worlds to @@ -248,7 +358,7 @@ class MyGameItem(Item): game: str = "My Game" ``` By convention this class definition will either be placed in your `__init__.py` -or your `Items.py`. For a more elaborate example see `worlds/oot/Items.py`. +or your `items.py`. For a more elaborate example see `worlds/oot/Items.py`. ### Your location type @@ -260,15 +370,15 @@ class MyGameLocation(Location): game: str = "My Game" # override constructor to automatically mark event locations as such - def __init__(self, player: int, name = "", code = None, parent = None): + def __init__(self, player: int, name = "", code = None, parent = None) -> None: super(MyGameLocation, self).__init__(player, name, code, parent) self.event = code is None ``` -in your `__init__.py` or your `Locations.py`. +in your `__init__.py` or your `locations.py`. ### Options -By convention options are defined in `Options.py` and will be used when parsing +By convention options are defined in `options.py` and will be used when parsing the players' yaml files. Each option has its own class, inherits from a base option type, has a docstring @@ -284,7 +394,7 @@ For more see `Options.py` in AP's base directory. #### Toggle, DefaultOnToggle -Those don't need any additional properties defined. After parsing the option, +These don't need any additional properties defined. After parsing the option, its `value` will either be True or False. #### Range @@ -310,7 +420,7 @@ default = 0 #### Sample ```python -# Options.py +# options.py from dataclasses import dataclass from Options import Toggle, Range, Choice, PerGameCommonOptions @@ -349,7 +459,7 @@ class MyGameOptions(PerGameCommonOptions): # __init__.py from worlds.AutoWorld import World -from .Options import MyGameOptions # import the options dataclass +from .options import MyGameOptions # import the options dataclass class MyGameWorld(World): @@ -366,9 +476,9 @@ class MyGameWorld(World): import settings import typing -from .Options import MyGameOptions # the options we defined earlier -from .Items import mygame_items # data used below to add items to the World -from .Locations import mygame_locations # same as above +from .options import MyGameOptions # the options we defined earlier +from .items import mygame_items # data used below to add items to the World +from .locations import mygame_locations # same as above from worlds.AutoWorld import World from BaseClasses import Region, Location, Entrance, Item, RegionType, ItemClassification @@ -427,7 +537,7 @@ The world has to provide the following things for generation * additions to the regions list: at least one called "Menu" * locations placed inside those regions * a `def create_item(self, item: str) -> MyGameItem` to create any item on demand -* applying `self.multiworld.push_precollected` for start inventory +* applying `self.multiworld.push_precollected` for world defined start inventory * `required_client_version: Tuple[int, int, int]` Optional client version as tuple of 3 ints to make sure the client is compatible to this world (e.g. implements all required features) when connecting. @@ -437,31 +547,32 @@ In addition, the following methods can be implemented and are called in this ord * `stage_assert_generate(cls, multiworld)` is a class method called at the start of generation to check the existence of prerequisite files, usually a ROM for games which require one. -* `def generate_early(self)` - called per player before any items or locations are created. You can set - properties on your world here. Already has access to player options and RNG. -* `def create_regions(self)` +* `generate_early(self)` + called per player before any items or locations are created. You can set properties on your world here. Already has + access to player options and RNG. This is the earliest step where the world should start setting up for the current + multiworld as any steps before this, the multiworld itself is still getting set up +* `create_regions(self)` called to place player's regions and their locations into the MultiWorld's regions list. If it's hard to separate, this can be done during `generate_early` or `create_items` as well. -* `def create_items(self)` +* `create_items(self)` called to place player's items into the MultiWorld's itempool. After this step all regions and items have to be in the MultiWorld's regions and itempool, and these lists should not be modified afterwards. -* `def set_rules(self)` +* `set_rules(self)` called to set access and item rules on locations and entrances. Locations have to be defined before this, or rule application can miss them. -* `def generate_basic(self)` +* `generate_basic(self)` called after the previous steps. Some placement and player specific randomizations can be done here. -* `pre_fill`, `fill_hook` and `post_fill` are called to modify item placement +* `pre_fill(self)`, `fill_hook(self)` and `post_fill(self)` are called to modify item placement before, during and after the regular fill process, before `generate_output`. If items need to be placed during pre_fill, these items can be determined and created using `get_prefill_items` -* `def generate_output(self, output_directory: str)` that creates the output +* `generate_output(self, output_directory: str)` that creates the output files if there is output to be generated. When this is called, `self.multiworld.get_locations(self.player)` has all locations for the player, with attribute `item` pointing to the item. `location.item.player` can be used to see if it's a local item. -* `fill_slot_data` and `modify_multidata` can be used to modify the data that +* `fill_slot_data(self)` and `modify_multidata(self, multidata: Dict[str, Any])` can be used to modify the data that will be used by the server to host the MultiWorld. @@ -478,9 +589,9 @@ def generate_early(self) -> None: ```python # we need a way to know if an item provides progress in the game ("key item") # this can be part of the items definition, or depend on recipe randomization -from .Items import is_progression # this is just a dummy +from .items import is_progression # this is just a dummy -def create_item(self, item: str): +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 \ @@ -488,7 +599,7 @@ def create_item(self, item: str): return MyGameItem(item, classification, self.item_name_to_id[item], self.player) -def create_event(self, event: str): +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) ``` @@ -581,7 +692,7 @@ def generate_basic(self) -> None: ```python from worlds.generic.Rules import add_rule, set_rule, forbid_item -from Items import get_item_type +from .items import get_item_type def set_rules(self) -> None: @@ -650,12 +761,12 @@ Please do this with caution and only when necessary. #### Sample ```python -# Logic.py +# logic.py from worlds.AutoWorld import LogicMixin class MyGameLogic(LogicMixin): - def mygame_has_key(self, player: int): + def mygame_has_key(self, player: int) -> bool: # Arguments above are free to choose # MultiWorld can be accessed through self.multiworld, explicitly passing in # MyGameWorld instance for easy options access is also a valid approach @@ -665,11 +776,11 @@ class MyGameLogic(LogicMixin): # __init__.py from worlds.generic.Rules import set_rule -import .Logic # apply the mixin by importing its file +import .logic # apply the mixin by importing its file class MyGameWorld(World): # ... - def set_rules(self): + def set_rules(self) -> None: set_rule(self.multiworld.get_location("A Door", self.player), lambda state: state.mygame_has_key(self.player)) ``` @@ -677,10 +788,10 @@ class MyGameWorld(World): ### Generate Output ```python -from .Mod import generate_mod +from .mod import generate_mod -def generate_output(self, output_directory: str): +def generate_output(self, output_directory: str) -> None: # How to generate the mod or ROM highly depends on the game # if the mod is written in Lua, Jinja can be used to fill a template # if the mod reads a json file, `json.dump()` can be used to generate that @@ -695,12 +806,10 @@ def generate_output(self, output_directory: str): # make sure to mark as not remote_start_inventory when connecting if stored in rom/mod "starter_items": [item.name for item in self.multiworld.precollected_items[self.player]], - "final_boss_hp": self.final_boss_hp, - # store option name "easy", "normal" or "hard" for difficuly - "difficulty": self.options.difficulty.current_key, - # store option value True or False for fixing a glitch - "fix_xyz_glitch": self.options.fix_xyz_glitch.value, } + + # add needed option results to the dictionary + data.update(self.options.as_dict("final_boss_hp", "difficulty", "fix_xyz_glitch")) # point to a ROM specified by the installation src = self.settings.rom_file # or point to worlds/mygame/data/mod_template @@ -724,7 +833,7 @@ data already exists on the server. The most common usage of slot data is to send to be aware of. ```python -def fill_slot_data(self): +def fill_slot_data(self) -> Dict[str, Any]: # in order for our game client to handle the generated seed correctly we need to know what the user selected # for their difficulty and final boss HP # a dictionary returned from this method gets set as the slot_data and will be sent to the client after connecting @@ -776,14 +885,14 @@ from . import MyGameTestBase class TestChestAccess(MyGameTestBase): - def test_sword_chests(self): + def test_sword_chests(self) -> None: """Test locations that require a sword""" locations = ["Chest1", "Chest2"] items = [["Sword"]] # this will test that each location can't be accessed without the "Sword", but can be accessed once obtained. self.assertAccessDependency(locations, items) - def test_any_weapon_chests(self): + def test_any_weapon_chests(self) -> None: """Test locations that require any weapon""" locations = [f"Chest{i}" for i in range(3, 6)] items = [["Sword"], ["Axe"], ["Spear"]] diff --git a/inno_setup.iss b/inno_setup.iss index b6f40f770110..b4779b1067b7 100644 --- a/inno_setup.iss +++ b/inno_setup.iss @@ -153,6 +153,11 @@ Root: HKCR; Subkey: "{#MyAppName}bn3bpatch"; ValueData: "Arc Root: HKCR; Subkey: "{#MyAppName}bn3bpatch\DefaultIcon"; ValueData: "{app}\ArchipelagoMMBN3Client.exe,0"; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}bn3bpatch\shell\open\command"; ValueData: """{app}\ArchipelagoMMBN3Client.exe"" ""%1"""; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: ".apemerald"; ValueData: "{#MyAppName}pkmnepatch"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}pkmnepatch"; ValueData: "Archipelago Pokemon Emerald Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}pkmnepatch\DefaultIcon"; ValueData: "{app}\ArchipelagoBizHawkClient.exe,0"; ValueType: string; ValueName: ""; +Root: HKCR; Subkey: "{#MyAppName}pkmnepatch\shell\open\command"; ValueData: """{app}\ArchipelagoBizHawkClient.exe"" ""%1"""; ValueType: string; ValueName: ""; + Root: HKCR; Subkey: ".apladx"; ValueData: "{#MyAppName}ladxpatch"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}ladxpatch"; ValueData: "Archipelago Links Awakening DX Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}ladxpatch\DefaultIcon"; ValueData: "{app}\ArchipelagoLinksAwakeningClient.exe,0"; ValueType: string; ValueName: ""; diff --git a/kvui.py b/kvui.py index 71bf80c86d9b..22e179d5be94 100644 --- a/kvui.py +++ b/kvui.py @@ -5,12 +5,13 @@ if sys.platform == "win32": import ctypes + # kivy 2.2.0 introduced DPI awareness on Windows, but it makes the UI enter an infinitely recursive re-layout # by setting the application to not DPI Aware, Windows handles scaling the entire window on its own, ignoring kivy's try: ctypes.windll.shcore.SetProcessDpiAwareness(0) except FileNotFoundError: # shcore may not be found on <= Windows 7 - pass # TODO: remove silent except when Python 3.8 is phased out. + pass # TODO: remove silent except when Python 3.8 is phased out. os.environ["KIVY_NO_CONSOLELOG"] = "1" os.environ["KIVY_NO_FILELOG"] = "1" @@ -18,14 +19,15 @@ os.environ["KIVY_LOG_ENABLE"] = "0" import Utils + if Utils.is_frozen(): os.environ["KIVY_DATA_DIR"] = Utils.local_path("data") from kivy.config import Config Config.set("input", "mouse", "mouse,disable_multitouch") -Config.set('kivy', 'exit_on_escape', '0') -Config.set('graphics', 'multisamples', '0') # multisamples crash old intel drivers +Config.set("kivy", "exit_on_escape", "0") +Config.set("graphics", "multisamples", "0") # multisamples crash old intel drivers from kivy.app import App from kivy.core.window import Window @@ -58,7 +60,6 @@ fade_in_animation = Animation(opacity=0, duration=0) + Animation(opacity=1, duration=0.25) - from NetUtils import JSONtoTextParser, JSONMessagePart, SlotType from Utils import async_start @@ -77,8 +78,8 @@ class HoverBehavior(object): border_point = ObjectProperty(None) def __init__(self, **kwargs): - self.register_event_type('on_enter') - self.register_event_type('on_leave') + self.register_event_type("on_enter") + self.register_event_type("on_leave") Window.bind(mouse_pos=self.on_mouse_pos) Window.bind(on_cursor_leave=self.on_cursor_leave) super(HoverBehavior, self).__init__(**kwargs) @@ -106,7 +107,7 @@ def on_cursor_leave(self, *args): self.dispatch("on_leave") -Factory.register('HoverBehavior', HoverBehavior) +Factory.register("HoverBehavior", HoverBehavior) class ToolTip(Label): @@ -121,6 +122,60 @@ class HovererableLabel(HoverBehavior, Label): pass +class TooltipLabel(HovererableLabel): + tooltip = None + + def create_tooltip(self, text, x, y): + text = text.replace("
", "\n").replace("&", "&").replace("&bl;", "[").replace("&br;", "]") + if self.tooltip: + # update + self.tooltip.children[0].text = text + else: + self.tooltip = FloatLayout() + tooltip_label = ToolTip(text=text) + self.tooltip.add_widget(tooltip_label) + fade_in_animation.start(self.tooltip) + App.get_running_app().root.add_widget(self.tooltip) + + # handle left-side boundary to not render off-screen + x = max(x, 3 + self.tooltip.children[0].texture_size[0] / 2) + + # position float layout + self.tooltip.x = x - self.tooltip.width / 2 + self.tooltip.y = y - self.tooltip.height / 2 + 48 + + def remove_tooltip(self): + if self.tooltip: + App.get_running_app().root.remove_widget(self.tooltip) + self.tooltip = None + + def on_mouse_pos(self, window, pos): + if not self.get_root_window(): + return # Abort if not displayed + super().on_mouse_pos(window, pos) + if self.refs and self.hovered: + + tx, ty = self.to_widget(*pos, relative=True) + # Why TF is Y flipped *within* the texture? + ty = self.texture_size[1] - ty + hit = False + for uid, zones in self.refs.items(): + for zone in zones: + x, y, w, h = zone + if x <= tx <= w and y <= ty <= h: + self.create_tooltip(uid.split("|", 1)[1], *pos) + hit = True + break + if not hit: + self.remove_tooltip() + + def on_enter(self): + pass + + def on_leave(self): + self.remove_tooltip() + + class ServerLabel(HovererableLabel): def __init__(self, *args, **kwargs): super(HovererableLabel, self).__init__(*args, **kwargs) @@ -189,11 +244,10 @@ class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior, """ Adds selection and focus behaviour to the view. """ -class SelectableLabel(RecycleDataViewBehavior, HovererableLabel): +class SelectableLabel(RecycleDataViewBehavior, TooltipLabel): """ Add selection support to the Label """ index = None selected = BooleanProperty(False) - tooltip = None def refresh_view_attrs(self, rv, index, data): """ Catch and handle the view changes """ @@ -201,56 +255,6 @@ def refresh_view_attrs(self, rv, index, data): return super(SelectableLabel, self).refresh_view_attrs( rv, index, data) - def create_tooltip(self, text, x, y): - text = text.replace("
", "\n").replace('&', '&').replace('&bl;', '[').replace('&br;', ']') - if self.tooltip: - # update - self.tooltip.children[0].text = text - else: - self.tooltip = FloatLayout() - tooltip_label = ToolTip(text=text) - self.tooltip.add_widget(tooltip_label) - fade_in_animation.start(self.tooltip) - App.get_running_app().root.add_widget(self.tooltip) - - # handle left-side boundary to not render off-screen - x = max(x, 3+self.tooltip.children[0].texture_size[0] / 2) - - # position float layout - self.tooltip.x = x - self.tooltip.width / 2 - self.tooltip.y = y - self.tooltip.height / 2 + 48 - - def remove_tooltip(self): - if self.tooltip: - App.get_running_app().root.remove_widget(self.tooltip) - self.tooltip = None - - def on_mouse_pos(self, window, pos): - if not self.get_root_window(): - return # Abort if not displayed - super().on_mouse_pos(window, pos) - if self.refs and self.hovered: - - tx, ty = self.to_widget(*pos, relative=True) - # Why TF is Y flipped *within* the texture? - ty = self.texture_size[1] - ty - hit = False - for uid, zones in self.refs.items(): - for zone in zones: - x, y, w, h = zone - if x <= tx <= w and y <= ty <= h: - self.create_tooltip(uid.split("|", 1)[1], *pos) - hit = True - break - if not hit: - self.remove_tooltip() - - def on_enter(self): - pass - - def on_leave(self): - self.remove_tooltip() - def on_touch_down(self, touch): """ Add selection on touch down """ if super(SelectableLabel, self).on_touch_down(touch): @@ -274,7 +278,7 @@ def on_touch_down(self, touch): elif not cmdinput.text and text.startswith("Missing: "): cmdinput.text = text.replace("Missing: ", "!hint_location ") - Clipboard.copy(text.replace('&', '&').replace('&bl;', '[').replace('&br;', ']')) + Clipboard.copy(text.replace("&", "&").replace("&bl;", "[").replace("&br;", "]")) return self.parent.select_with_touch(self.index, touch) def apply_selection(self, rv, index, is_selected): @@ -282,9 +286,68 @@ def apply_selection(self, rv, index, is_selected): self.selected = is_selected +class HintLabel(RecycleDataViewBehavior, BoxLayout): + selected = BooleanProperty(False) + striped = BooleanProperty(False) + index = None + no_select = [] + + def __init__(self): + super(HintLabel, self).__init__() + self.receiving_text = "" + self.item_text = "" + self.finding_text = "" + self.location_text = "" + self.entrance_text = "" + self.found_text = "" + for child in self.children: + child.bind(texture_size=self.set_height) + + def set_height(self, instance, value): + self.height = max([child.texture_size[1] for child in self.children]) + + def refresh_view_attrs(self, rv, index, data): + self.index = index + if "select" in data and not data["select"] and index not in self.no_select: + self.no_select.append(index) + self.striped = data["striped"] + self.receiving_text = data["receiving"]["text"] + self.item_text = data["item"]["text"] + self.finding_text = data["finding"]["text"] + self.location_text = data["location"]["text"] + self.entrance_text = data["entrance"]["text"] + self.found_text = data["found"]["text"] + self.height = self.minimum_height + return super(HintLabel, self).refresh_view_attrs(rv, index, data) + + def on_touch_down(self, touch): + """ Add selection on touch down """ + if super(HintLabel, self).on_touch_down(touch): + return True + if self.index not in self.no_select: + if self.collide_point(*touch.pos): + if self.selected: + self.parent.clear_selection() + else: + text = "".join([self.receiving_text, "\'s ", self.item_text, " is at ", self.location_text, " in ", + self.finding_text, "\'s World", (" at " + self.entrance_text) + if self.entrance_text != "Vanilla" + else "", ". (", self.found_text.lower(), ")"]) + temp = MarkupLabel(text).markup + text = "".join( + part for part in temp if not part.startswith(("[color", "[/color]", "[ref=", "[/ref]"))) + Clipboard.copy(escape_markup(text).replace("&", "&").replace("&bl;", "[").replace("&br;", "]")) + return self.parent.select_with_touch(self.index, touch) + + def apply_selection(self, rv, index, is_selected): + """ Respond to the selection of items in the view. """ + if self.index not in self.no_select: + self.selected = is_selected + + class ConnectBarTextInput(TextInput): def insert_text(self, substring, from_undo=False): - s = substring.replace('\n', '').replace('\r', '') + s = substring.replace("\n", "").replace("\r", "") return super(ConnectBarTextInput, self).insert_text(s, from_undo=from_undo) @@ -302,7 +365,7 @@ def __init__(self, **kwargs): 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=(None, None), width=max(100, int(label.width) + 40), separator_color=separator_color, **kwargs) self.height += max(0, label.height - 18) @@ -358,11 +421,14 @@ def build(self) -> Layout: # top part server_label = ServerLabel() self.connect_layout.add_widget(server_label) - self.server_connect_bar = ConnectBarTextInput(text=self.ctx.suggested_address or "archipelago.gg:", size_hint_y=None, + self.server_connect_bar = ConnectBarTextInput(text=self.ctx.suggested_address or "archipelago.gg:", + size_hint_y=None, height=dp(30), multiline=False, write_tab=False) + def connect_bar_validate(sender): if not self.ctx.server: self.connect_button_action(sender) + self.server_connect_bar.bind(on_text_validate=connect_bar_validate) self.connect_layout.add_widget(self.server_connect_bar) self.server_connect_button = Button(text="Connect", size=(dp(100), dp(30)), size_hint_y=None, size_hint_x=None) @@ -383,20 +449,22 @@ def connect_bar_validate(sender): bridge_logger = logging.getLogger(logger_name) panel = TabbedPanelItem(text=display_name) self.log_panels[display_name] = panel.content = UILog(bridge_logger) - self.tabs.add_widget(panel) + if len(self.logging_pairs) > 1: + # show Archipelago tab if other logging is present + self.tabs.add_widget(panel) + + hint_panel = TabbedPanelItem(text="Hints") + self.log_panels["Hints"] = hint_panel.content = HintLog(self.json_to_kivy_parser) + self.tabs.add_widget(hint_panel) + + if len(self.logging_pairs) == 1: + self.tabs.default_tab_text = "Archipelago" self.main_area_container = GridLayout(size_hint_y=1, rows=1) self.main_area_container.add_widget(self.tabs) self.grid.add_widget(self.main_area_container) - if len(self.logging_pairs) == 1: - # Hide Tab selection if only one tab - self.tabs.clear_tabs() - self.tabs.do_default_tab = False - self.tabs.current_tab.height = 0 - self.tabs.tab_height = 0 - # bottom part bottom_layout = BoxLayout(orientation="horizontal", size_hint_y=None, height=dp(30)) info_button = Button(size=(dp(100), dp(30)), text="Command:", size_hint_x=None) @@ -422,7 +490,7 @@ def connect_bar_validate(sender): return self.container def update_texts(self, dt): - if hasattr(self.tabs.content.children[0], 'fix_heights'): + if hasattr(self.tabs.content.children[0], "fix_heights"): self.tabs.content.children[0].fix_heights() # TODO: remove this when Kivy fixes this upstream if self.ctx.server: self.title = self.base_title + " " + Utils.__version__ + \ @@ -499,6 +567,10 @@ def set_new_energy_link_value(self): if hasattr(self, "energy_link_label"): self.energy_link_label.text = f"EL: {Utils.format_SI_prefix(self.ctx.current_energy_link_value)}J" + def update_hints(self): + hints = self.ctx.stored_data[f"_read_hints_{self.ctx.team}_{self.ctx.slot}"] + self.log_panels["Hints"].refresh_hints(hints) + # default F1 keybind, opens a settings menu, that seems to break the layout engine once closed def open_settings(self, *largs): pass @@ -513,12 +585,12 @@ def __init__(self, on_log): def format_compact(record: logging.LogRecord) -> str: if isinstance(record.msg, Exception): return str(record.msg) - return (f'{record.exc_info[1]}\n' if record.exc_info else '') + str(record.msg).split("\n")[0] + return (f"{record.exc_info[1]}\n" if record.exc_info else "") + str(record.msg).split("\n")[0] def handle(self, record: logging.LogRecord) -> None: - if getattr(record, 'skip_gui', False): + if getattr(record, "skip_gui", False): pass # skip output - elif getattr(record, 'compact_gui', False): + elif getattr(record, "compact_gui", False): self.on_log(self.format_compact(record)) else: self.on_log(self.format(record)) @@ -552,6 +624,44 @@ def fix_heights(self): element.height = element.texture_size[1] +class HintLog(RecycleView): + header = { + "receiving": {"text": "[u]Receiving Player[/u]"}, + "item": {"text": "[u]Item[/u]"}, + "finding": {"text": "[u]Finding Player[/u]"}, + "location": {"text": "[u]Location[/u]"}, + "entrance": {"text": "[u]Entrance[/u]"}, + "found": {"text": "[u]Status[/u]"}, + "striped": True, + "select": False, + } + + def __init__(self, parser): + super(HintLog, self).__init__() + self.data = [self.header] + self.parser = parser + + def refresh_hints(self, hints): + self.data = [self.header] + striped = False + for hint in hints: + self.data.append({ + "striped": striped, + "receiving": {"text": self.parser.handle_node({"type": "player_id", "text": hint["receiving_player"]})}, + "item": {"text": self.parser.handle_node( + {"type": "item_id", "text": hint["item"], "flags": hint["item_flags"]})}, + "finding": {"text": self.parser.handle_node({"type": "player_id", "text": hint["finding_player"]})}, + "location": {"text": self.parser.handle_node({"type": "location_id", "text": hint["location"]})}, + "entrance": {"text": self.parser.handle_node({"type": "color" if hint["entrance"] else "text", + "color": "blue", "text": hint["entrance"] + if hint["entrance"] else "Vanilla"})}, + "found": { + "text": self.parser.handle_node({"type": "color", "color": "green" if hint["found"] else "red", + "text": "Found" if hint["found"] else "Not Found"})}, + }) + striped = not striped + + class E(ExceptionHandler): logger = logging.getLogger("Client") @@ -599,7 +709,7 @@ def _handle_player_id(self, node: JSONMessagePart): f"Type: {SlotType(slot_info.type).name}" if slot_info.group_members: text += f"
Members:
" + \ - '
'.join(self.ctx.player_names[player] for player in slot_info.group_members) + "
".join(self.ctx.player_names[player] for player in slot_info.group_members) node.setdefault("refs", []).append(text) return super(KivyJSONtoTextParser, self)._handle_player_id(node) @@ -627,4 +737,3 @@ def _handle_text(self, node: JSONMessagePart): if os.path.exists(user_file): logging.info("Loading user.kv into builder.") Builder.load_file(user_file) - diff --git a/requirements.txt b/requirements.txt index bfc637a80a2b..7f9cddc2879c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,8 +5,8 @@ jellyfish>=1.0.1 jinja2>=3.1.2 schema>=0.7.5 kivy>=2.2.0 -bsdiff4>=1.2.3 +bsdiff4>=1.2.4 platformdirs>=3.9.1 certifi>=2023.7.22 -cython>=0.29.35 +cython>=3.0.5 cymem>=2.0.8 diff --git a/setup.py b/setup.py index cea60dab8320..0d2da0bb1818 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ # This is a bit jank. We need cx-Freeze to be able to run anything from this script, so install it try: - requirement = 'cx-Freeze>=6.15.2' + requirement = 'cx-Freeze>=6.15.10' import pkg_resources try: pkg_resources.require(requirement) @@ -620,7 +620,7 @@ def find_lib(lib, arch, libc): "excludes": ["numpy", "Cython", "PySide2", "PIL", "pandas"], "zip_include_packages": ["*"], - "zip_exclude_packages": ["worlds", "sc2"], + "zip_exclude_packages": ["worlds", "sc2", "orjson"], # TODO: remove orjson here once we drop py3.8 support "include_files": [], # broken in cx 6.14.0, we use more special sauce now "include_msvcr": False, "replace_paths": ["*."], diff --git a/test/general/test_fill.py b/test/general/test_fill.py index 1e469ef04d0d..e454b3e61d7a 100644 --- a/test/general/test_fill.py +++ b/test/general/test_fill.py @@ -442,6 +442,47 @@ def test_swap_to_earlier_location_with_item_rule(self): self.assertTrue(sphere1_loc.item, "Did not swap required item into Sphere 1") self.assertEqual(sphere1_loc.item, allowed_item, "Wrong item in Sphere 1") + def test_swap_to_earlier_location_with_item_rule2(self): + """Test that swap works before all items are placed""" + multi_world = generate_multi_world(1) + player1 = generate_player_data(multi_world, 1, 5, 5) + locations = player1.locations[:] # copy required + items = player1.prog_items[:] # copy required + # Two items provide access to sphere 2. + # One of them is forbidden in sphere 1, the other is first placed in sphere 4 because of placement order, + # requiring a swap. + # There are spheres in between, so for the swap to work, it'll have to assume all other items are collected. + one_to_two1 = items[4].name + one_to_two2 = items[3].name + three_to_four = items[2].name + two_to_three1 = items[1].name + two_to_three2 = items[0].name + # Sphere 4 + set_rule(locations[0], lambda state: ((state.has(one_to_two1, player1.id) or state.has(one_to_two2, player1.id)) + and state.has(two_to_three1, player1.id) + and state.has(two_to_three2, player1.id) + and state.has(three_to_four, player1.id))) + # Sphere 3 + set_rule(locations[1], lambda state: ((state.has(one_to_two1, player1.id) or state.has(one_to_two2, player1.id)) + and state.has(two_to_three1, player1.id) + and state.has(two_to_three2, player1.id))) + # Sphere 2 + set_rule(locations[2], lambda state: state.has(one_to_two1, player1.id) or state.has(one_to_two2, player1.id)) + # Sphere 1 + sphere1_loc1 = locations[3] + sphere1_loc2 = locations[4] + # forbid one_to_two2 in sphere 1 to make the swap happen as described above + add_item_rule(sphere1_loc1, lambda item_to_place: item_to_place.name != one_to_two2) + add_item_rule(sphere1_loc2, lambda item_to_place: item_to_place.name != one_to_two2) + + # Now fill should place one_to_two1 in sphere1_loc1 or sphere1_loc2 via swap, + # which it will attempt before two_to_three and three_to_four are placed, testing the behavior. + fill_restrictive(multi_world, multi_world.state, player1.locations, player1.prog_items) + # assert swap happened + self.assertTrue(sphere1_loc1.item and sphere1_loc2.item, "Did not swap required item into Sphere 1") + self.assertTrue(sphere1_loc1.item.name == one_to_two1 or + sphere1_loc2.item.name == one_to_two1, "Wrong item in Sphere 1") + def test_double_sweep(self): """Test that sweep doesn't duplicate Event items when sweeping""" # test for PR1114 diff --git a/test/general/test_implemented.py b/test/general/test_implemented.py index b60bcee46784..624be710185d 100644 --- a/test/general/test_implemented.py +++ b/test/general/test_implemented.py @@ -40,8 +40,8 @@ def test_slot_data(self): # has an await for generate_output which isn't being called if game_name in {"Ocarina of Time", "Zillion"}: continue - with self.subTest(game_name): - multiworld = setup_solo_multiworld(world_type) + multiworld = setup_solo_multiworld(world_type) + with self.subTest(game=game_name, seed=multiworld.seed): distribute_items_restrictive(multiworld) call_all(multiworld, "post_fill") for key, data in multiworld.worlds[1].fill_slot_data().items(): diff --git a/test/general/test_items.py b/test/general/test_items.py index f1def1db2ae4..586f2aa2fb0a 100644 --- a/test/general/test_items.py +++ b/test/general/test_items.py @@ -60,3 +60,12 @@ def testItemsInDatapackage(self): multiworld = setup_solo_multiworld(world_type) for item in multiworld.itempool: self.assertIn(item.name, world_type.item_name_to_id) + + def test_item_descriptions_have_valid_names(self): + """Ensure all item descriptions match an item name or item group name""" + for game_name, world_type in AutoWorldRegister.world_types.items(): + valid_names = world_type.item_names.union(world_type.item_name_groups) + for name in world_type.item_descriptions: + with self.subTest("Name should be valid", game=game_name, item=name): + self.assertIn(name, valid_names, + "All item descriptions must match defined item names") diff --git a/test/general/test_locations.py b/test/general/test_locations.py index 63b3b0f3640a..725b48e62f72 100644 --- a/test/general/test_locations.py +++ b/test/general/test_locations.py @@ -66,3 +66,12 @@ def test_location_group(self): for location in locations: self.assertIn(location, world_type.location_name_to_id) self.assertNotIn(group_name, world_type.location_name_to_id) + + def test_location_descriptions_have_valid_names(self): + """Ensure all location descriptions match a location name or location group name""" + for game_name, world_type in AutoWorldRegister.world_types.items(): + valid_names = world_type.location_names.union(world_type.location_name_groups) + for name in world_type.location_descriptions: + with self.subTest("Name should be valid", game=game_name, location=name): + self.assertIn(name, valid_names, + "All location descriptions must match defined location names") diff --git a/test/webhost/test_option_presets.py b/test/webhost/test_option_presets.py new file mode 100644 index 000000000000..8c6ebea2088f --- /dev/null +++ b/test/webhost/test_option_presets.py @@ -0,0 +1,63 @@ +import unittest + +from worlds import AutoWorldRegister +from Options import Choice, SpecialRange, Toggle, Range + + +class TestOptionPresets(unittest.TestCase): + def test_option_presets_have_valid_options(self): + """Test that all predefined option presets are valid options.""" + for game_name, world_type in AutoWorldRegister.world_types.items(): + presets = world_type.web.options_presets + for preset_name, preset in presets.items(): + for option_name, option_value in preset.items(): + with self.subTest(game=game_name, preset=preset_name, option=option_name): + try: + option = world_type.options_dataclass.type_hints[option_name].from_any(option_value) + supported_types = [Choice, Toggle, Range, SpecialRange] + if not any([issubclass(option.__class__, t) for t in supported_types]): + self.fail(f"'{option_name}' in preset '{preset_name}' for game '{game_name}' " + f"is not a supported type for webhost. " + f"Supported types: {', '.join([t.__name__ for t in supported_types])}") + except AssertionError as ex: + self.fail(f"Option '{option_name}': '{option_value}' in preset '{preset_name}' for game " + f"'{game_name}' is not valid. Error: {ex}") + except KeyError as ex: + self.fail(f"Option '{option_name}' in preset '{preset_name}' for game '{game_name}' is " + f"not a defined option. Error: {ex}") + + def test_option_preset_values_are_explicitly_defined(self): + """Test that option preset values are not a special flavor of 'random' or use from_text to resolve another + value. + """ + for game_name, world_type in AutoWorldRegister.world_types.items(): + presets = world_type.web.options_presets + for preset_name, preset in presets.items(): + for option_name, option_value in preset.items(): + with self.subTest(game=game_name, preset=preset_name, option=option_name): + # Check for non-standard random values. + self.assertFalse( + str(option_value).startswith("random-"), + f"'{option_name}': '{option_value}' in preset '{preset_name}' for game '{game_name}' " + f"is not supported for webhost. Special random values are not supported for presets." + ) + + option = world_type.options_dataclass.type_hints[option_name].from_any(option_value) + + # Check for from_text resolving to a different value. ("random" is allowed though.) + if option_value != "random" and isinstance(option_value, str): + # Allow special named values for SpecialRange option presets. + if isinstance(option, SpecialRange): + self.assertTrue( + option_value in option.special_range_names, + f"Invalid preset '{option_name}': '{option_value}' in preset '{preset_name}' " + f"for game '{game_name}'. Expected {option.special_range_names.keys()} or " + f"{option.range_start}-{option.range_end}." + ) + else: + self.assertTrue( + option.name_lookup.get(option.value, None) == option_value, + f"'{option_name}': '{option_value}' in preset '{preset_name}' for game " + f"'{game_name}' is not supported for webhost. Values must not be resolved to a " + f"different option via option.from_text (or an alias)." + ) diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index d05797cf9e12..5d0533e068d6 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -3,6 +3,7 @@ import hashlib import logging import pathlib +import re import sys import time from dataclasses import make_dataclass @@ -51,11 +52,17 @@ def __new__(mcs, name: str, bases: Tuple[type, ...], dct: Dict[str, Any]) -> Aut dct["item_name_groups"] = {group_name: frozenset(group_set) for group_name, group_set in dct.get("item_name_groups", {}).items()} dct["item_name_groups"]["Everything"] = dct["item_names"] + dct["item_descriptions"] = {name: _normalize_description(description) for name, description + in dct.get("item_descriptions", {}).items()} + dct["item_descriptions"]["Everything"] = "All items in the entire game." dct["location_names"] = frozenset(dct["location_name_to_id"]) dct["location_name_groups"] = {group_name: frozenset(group_set) for group_name, group_set in dct.get("location_name_groups", {}).items()} dct["location_name_groups"]["Everywhere"] = dct["location_names"] dct["all_item_and_group_names"] = frozenset(dct["item_names"] | set(dct.get("item_name_groups", {}))) + dct["location_descriptions"] = {name: _normalize_description(description) for name, description + in dct.get("location_descriptions", {}).items()} + dct["location_descriptions"]["Everywhere"] = "All locations in the entire game." # move away from get_required_client_version function if "game" in dct: @@ -113,10 +120,10 @@ def _timed_call(method: Callable[..., Any], *args: Any, taken = time.perf_counter() - start if taken > 1.0: if player and multiworld: - perf_logger.info(f"Took {taken} seconds in {method.__qualname__} for player {player}, " + perf_logger.info(f"Took {taken:.4f} seconds in {method.__qualname__} for player {player}, " f"named {multiworld.player_name[player]}.") else: - perf_logger.info(f"Took {taken} seconds in {method.__qualname__}.") + perf_logger.info(f"Took {taken:.4f} seconds in {method.__qualname__}.") return ret @@ -179,6 +186,9 @@ class WebWorld: bug_report_page: Optional[str] """display a link to a bug report page, most likely a link to a GitHub issue page.""" + options_presets: Dict[str, Dict[str, Any]] = {} + """A dictionary containing a collection of developer-defined game option presets.""" + class World(metaclass=AutoWorldRegister): """A World object encompasses a game's Items, Locations, Rules and additional data or functionality required. @@ -205,9 +215,23 @@ class World(metaclass=AutoWorldRegister): item_name_groups: ClassVar[Dict[str, Set[str]]] = {} """maps item group names to sets of items. Example: {"Weapons": {"Sword", "Bow"}}""" + item_descriptions: ClassVar[Dict[str, str]] = {} + """An optional map from item names (or item group names) to brief descriptions for users. + + Individual newlines and indentation will be collapsed into spaces before these descriptions are + displayed. This may cover only a subset of items. + """ + location_name_groups: ClassVar[Dict[str, Set[str]]] = {} """maps location group names to sets of locations. Example: {"Sewer": {"Sewer Key Drop 1", "Sewer Key Drop 2"}}""" + location_descriptions: ClassVar[Dict[str, str]] = {} + """An optional map from location names (or location group names) to brief descriptions for users. + + Individual newlines and indentation will be collapsed into spaces before these descriptions are + displayed. This may cover only a subset of locations. + """ + data_version: ClassVar[int] = 0 """ Increment this every time something in your world's names/id mappings changes. @@ -462,3 +486,17 @@ def data_package_checksum(data: "GamesPackage") -> str: assert sorted(data) == list(data), "Data not ordered" from NetUtils import encode return hashlib.sha1(encode(data).encode()).hexdigest() + + +def _normalize_description(description): + """Normalizes a description in item_descriptions or location_descriptions. + + This allows authors to write descritions with nice indentation and line lengths in their world + definitions without having it affect the rendered format. + """ + # First, collapse the whitespace around newlines and the ends of the description. + description = re.sub(r' *\n *', '\n', description.strip()) + # Next, condense individual newlines into spaces. + description = re.sub(r'(? None: zip_file = file if file else self.path if not zip_file: raise FileNotFoundError(f"Cannot write {self.__class__.__name__} due to no path provided.") - with zipfile.ZipFile(zip_file, "w", self.compression_method, True, self.compression_level) \ - as zf: - if file: - self.path = zf.filename - self.write_contents(zf) + with semaphore: # TODO: remove semaphore once generate_output has a thread limit + with zipfile.ZipFile( + zip_file, "w", self.compression_method, True, self.compression_level) as zf: + if file: + self.path = zf.filename + self.write_contents(zf) def write_contents(self, opened_zipfile: zipfile.ZipFile) -> None: manifest = self.get_manifest() diff --git a/worlds/__init__.py b/worlds/__init__.py index 40e0b20f1974..66c91639b9f3 100644 --- a/worlds/__init__.py +++ b/worlds/__init__.py @@ -1,43 +1,40 @@ import importlib import os import sys -import typing import warnings import zipimport +from typing import Dict, List, NamedTuple, TypedDict -from Utils import user_path, local_path +from Utils import local_path, user_path local_folder = os.path.dirname(__file__) user_folder = user_path("worlds") if user_path() != local_path() else None -__all__ = ( - "lookup_any_item_id_to_name", - "lookup_any_location_id_to_name", +__all__ = { "network_data_package", "AutoWorldRegister", "world_sources", "local_folder", "user_folder", -) - - -class GamesData(typing.TypedDict): - item_name_groups: typing.Dict[str, typing.List[str]] - item_name_to_id: typing.Dict[str, int] - location_name_groups: typing.Dict[str, typing.List[str]] - location_name_to_id: typing.Dict[str, int] - version: int + "GamesPackage", + "DataPackage", +} -class GamesPackage(GamesData, total=False): +class GamesPackage(TypedDict, total=False): + item_name_groups: Dict[str, List[str]] + item_name_to_id: Dict[str, int] + location_name_groups: Dict[str, List[str]] + location_name_to_id: Dict[str, int] checksum: str + version: int # TODO: Remove support after per game data packages API change. -class DataPackage(typing.TypedDict): - games: typing.Dict[str, GamesPackage] +class DataPackage(TypedDict): + games: Dict[str, GamesPackage] -class WorldSource(typing.NamedTuple): +class WorldSource(NamedTuple): path: str # typically relative path from this module is_zip: bool = False relative: bool = True # relative to regular world import folder @@ -88,7 +85,7 @@ def load(self) -> bool: # find potential world containers, currently folders and zip-importable .apworld's -world_sources: typing.List[WorldSource] = [] +world_sources: List[WorldSource] = [] for folder in (folder for folder in (user_folder, local_folder) if folder): relative = folder == local_folder for entry in os.scandir(folder): @@ -105,25 +102,9 @@ def load(self) -> bool: for world_source in world_sources: world_source.load() -lookup_any_item_id_to_name = {} -lookup_any_location_id_to_name = {} -games: typing.Dict[str, GamesPackage] = {} - -from .AutoWorld import AutoWorldRegister # noqa: E402 - # Build the data package for each game. -for world_name, world in AutoWorldRegister.world_types.items(): - games[world_name] = world.get_data_package_data() - lookup_any_item_id_to_name.update(world.item_id_to_name) - lookup_any_location_id_to_name.update(world.location_id_to_name) +from .AutoWorld import AutoWorldRegister network_data_package: DataPackage = { - "games": games, + "games": {world_name: world.get_data_package_data() for world_name, world in AutoWorldRegister.world_types.items()}, } - -# Set entire datapackage to version 0 if any of them are set to 0 -if any(not world.data_version for world in AutoWorldRegister.world_types.values()): - import logging - - logging.warning(f"Datapackage is in custom mode. Custom Worlds: " - f"{[world for world in AutoWorldRegister.world_types.values() if not world.data_version]}") diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py index e1ae0cc6e6c3..b80cec578a97 100644 --- a/worlds/alttp/Rom.py +++ b/worlds/alttp/Rom.py @@ -783,6 +783,7 @@ def get_nonnative_item_sprite(code: int) -> int: def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): local_random = world.per_slot_randoms[player] + local_world = world.worlds[player] # patch items @@ -1190,12 +1191,8 @@ def chunk(l, n): ]) # set Fountain bottle exchange items - if world.difficulty[player] in ['hard', 'expert']: - rom.write_byte(0x348FF, [0x16, 0x2B, 0x2C, 0x2D, 0x3C, 0x48][local_random.randint(0, 5)]) - rom.write_byte(0x3493B, [0x16, 0x2B, 0x2C, 0x2D, 0x3C, 0x48][local_random.randint(0, 5)]) - else: - rom.write_byte(0x348FF, [0x16, 0x2B, 0x2C, 0x2D, 0x3C, 0x3D, 0x48][local_random.randint(0, 6)]) - rom.write_byte(0x3493B, [0x16, 0x2B, 0x2C, 0x2D, 0x3C, 0x3D, 0x48][local_random.randint(0, 6)]) + rom.write_byte(0x348FF, item_table[local_world.waterfall_fairy_bottle_fill].item_code) + rom.write_byte(0x3493B, item_table[local_world.pyramid_fairy_bottle_fill].item_code) # enable Fat Fairy Chests rom.write_bytes(0x1FC16, [0xB1, 0xC6, 0xF9, 0xC9, 0xC6, 0xF9]) diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py index d89e65c59d89..2cae70e0ea49 100644 --- a/worlds/alttp/__init__.py +++ b/worlds/alttp/__init__.py @@ -249,6 +249,8 @@ def enemizer_path(self) -> str: rom_name_available_event: threading.Event has_progressive_bows: bool dungeons: typing.Dict[str, Dungeon] + waterfall_fairy_bottle_fill: str + pyramid_fairy_bottle_fill: str def __init__(self, *args, **kwargs): self.dungeon_local_item_names = set() @@ -256,6 +258,8 @@ def __init__(self, *args, **kwargs): self.rom_name_available_event = threading.Event() self.has_progressive_bows = False self.dungeons = {} + self.waterfall_fairy_bottle_fill = "Bottle" + self.pyramid_fairy_bottle_fill = "Bottle" super(ALTTPWorld, self).__init__(*args, **kwargs) @classmethod @@ -273,52 +277,62 @@ def stage_assert_generate(cls, multiworld: MultiWorld): def generate_early(self): player = self.player - world = self.multiworld + multiworld = self.multiworld - if world.mode[player] == 'standard' \ - and world.smallkey_shuffle[player] \ - and world.smallkey_shuffle[player] != smallkey_shuffle.option_universal \ - and world.smallkey_shuffle[player] != smallkey_shuffle.option_own_dungeons \ - and world.smallkey_shuffle[player] != smallkey_shuffle.option_start_with: + # fairy bottle fills + bottle_options = [ + "Bottle (Red Potion)", "Bottle (Green Potion)", "Bottle (Blue Potion)", + "Bottle (Bee)", "Bottle (Good Bee)" + ] + if multiworld.difficulty[player] 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' \ + and multiworld.smallkey_shuffle[player] \ + and multiworld.smallkey_shuffle[player] != smallkey_shuffle.option_universal \ + and multiworld.smallkey_shuffle[player] != smallkey_shuffle.option_own_dungeons \ + and multiworld.smallkey_shuffle[player] != smallkey_shuffle.option_start_with: self.multiworld.local_early_items[self.player]["Small Key (Hyrule Castle)"] = 1 # system for sharing ER layouts - self.er_seed = str(world.random.randint(0, 2 ** 64)) + self.er_seed = str(multiworld.random.randint(0, 2 ** 64)) - if "-" in world.shuffle[player]: - shuffle, seed = world.shuffle[player].split("-", 1) - world.shuffle[player] = shuffle + if "-" in multiworld.shuffle[player]: + shuffle, seed = multiworld.shuffle[player].split("-", 1) + multiworld.shuffle[player] = shuffle if shuffle == "vanilla": self.er_seed = "vanilla" - elif seed.startswith("group-") or world.is_race: - self.er_seed = get_same_seed(world, ( - shuffle, seed, world.retro_caves[player], world.mode[player], world.logic[player])) + elif seed.startswith("group-") or multiworld.is_race: + self.er_seed = get_same_seed(multiworld, ( + shuffle, seed, multiworld.retro_caves[player], multiworld.mode[player], multiworld.logic[player])) else: # not a race or group seed, use set seed as is. self.er_seed = seed - elif world.shuffle[player] == "vanilla": + elif multiworld.shuffle[player] == "vanilla": self.er_seed = "vanilla" for dungeon_item in ["smallkey_shuffle", "bigkey_shuffle", "compass_shuffle", "map_shuffle"]: - option = getattr(world, dungeon_item)[player] + option = getattr(multiworld, dungeon_item)[player] if option == "own_world": - world.local_items[player].value |= self.item_name_groups[option.item_name_group] + multiworld.local_items[player].value |= self.item_name_groups[option.item_name_group] elif option == "different_world": - world.non_local_items[player].value |= self.item_name_groups[option.item_name_group] - if world.mode[player] == "standard": - world.non_local_items[player].value -= {"Small Key (Hyrule Castle)"} + 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)"} elif option.in_dungeon: self.dungeon_local_item_names |= self.item_name_groups[option.item_name_group] if option == "original_dungeon": self.dungeon_specific_item_names |= self.item_name_groups[option.item_name_group] - world.difficulty_requirements[player] = difficulties[world.difficulty[player]] + multiworld.difficulty_requirements[player] = difficulties[multiworld.difficulty[player]] # enforce pre-defined local items. - if world.goal[player] in ["localtriforcehunt", "localganontriforcehunt"]: - world.local_items[player].value.add('Triforce Piece') + if multiworld.goal[player] in ["localtriforcehunt", "localganontriforcehunt"]: + multiworld.local_items[player].value.add('Triforce Piece') # Not possible to place crystals outside boss prizes yet (might as well make it consistent with pendants too). - world.non_local_items[player].value -= item_name_groups['Pendants'] - world.non_local_items[player].value -= item_name_groups['Crystals'] + multiworld.non_local_items[player].value -= item_name_groups['Pendants'] + multiworld.non_local_items[player].value -= item_name_groups['Crystals'] create_dungeons = create_dungeons @@ -364,7 +378,6 @@ def create_regions(self): world.register_indirect_condition(world.get_region(region_name, player), world.get_entrance(entrance_name, player)) - def collect_item(self, state: CollectionState, item: Item, remove=False): item_name = item.name if item_name.startswith('Progressive '): @@ -693,13 +706,18 @@ def bool_to_text(variable: typing.Union[bool, str]) -> str: spoiler_handle.write('Prize shuffle %s\n' % self.multiworld.shuffle_prizes[self.player]) def write_spoiler(self, spoiler_handle: typing.TextIO) -> None: + player_name = self.multiworld.get_player_name(self.player) spoiler_handle.write("\n\nMedallions:\n") - spoiler_handle.write(f"\nMisery Mire ({self.multiworld.get_player_name(self.player)}):" + spoiler_handle.write(f"\nMisery Mire ({player_name}):" f" {self.multiworld.required_medallions[self.player][0]}") spoiler_handle.write( - f"\nTurtle Rock ({self.multiworld.get_player_name(self.player)}):" + f"\nTurtle Rock ({player_name}):" f" {self.multiworld.required_medallions[self.player][1]}") - + spoiler_handle.write("\n\nFairy Fountain Bottle Fill:\n") + spoiler_handle.write(f"\nPyramid Fairy ({player_name}):" + 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": def create_boss_map() -> typing.Dict: boss_map = { diff --git a/worlds/checksfinder/__init__.py b/worlds/checksfinder/__init__.py index 4978500da0cb..621e8f5c37b2 100644 --- a/worlds/checksfinder/__init__.py +++ b/worlds/checksfinder/__init__.py @@ -14,8 +14,8 @@ class ChecksFinderWeb(WebWorld): "A guide to setting up the Archipelago ChecksFinder software on your computer. This guide covers " "single-player, multiworld, and related software.", "English", - "checksfinder_en.md", - "checksfinder/en", + "setup_en.md", + "setup/en", ["Mewlif"] )] diff --git a/worlds/checksfinder/docs/checksfinder_en.md b/worlds/checksfinder/docs/setup_en.md similarity index 100% rename from worlds/checksfinder/docs/checksfinder_en.md rename to worlds/checksfinder/docs/setup_en.md diff --git a/worlds/dark_souls_3/Items.py b/worlds/dark_souls_3/Items.py index 754282e73647..a13235b12aac 100644 --- a/worlds/dark_souls_3/Items.py +++ b/worlds/dark_souls_3/Items.py @@ -1271,6 +1271,14 @@ def get_name_to_id() -> dict: ("Dorris Swarm", 0x40393870, DS3ItemCategory.SKIP), ]] +item_descriptions = { + "Cinders": """ + All four Cinders of a Lord. + + Once you have these four, you can fight Soul of Cinder and win the game. + """, +} + _all_items = _vanilla_items + _dlc_items item_dictionary = {item_data.name: item_data for item_data in _all_items} diff --git a/worlds/dark_souls_3/__init__.py b/worlds/dark_souls_3/__init__.py index 195d319887d5..b9879f70f302 100644 --- a/worlds/dark_souls_3/__init__.py +++ b/worlds/dark_souls_3/__init__.py @@ -7,7 +7,7 @@ from worlds.AutoWorld import World, WebWorld from worlds.generic.Rules import set_rule, add_rule, add_item_rule -from .Items import DarkSouls3Item, DS3ItemCategory, item_dictionary, key_item_names +from .Items import DarkSouls3Item, DS3ItemCategory, item_dictionary, key_item_names, item_descriptions from .Locations import DarkSouls3Location, DS3LocationCategory, location_tables, location_dictionary from .Options import RandomizeWeaponLevelOption, PoolTypeOption, dark_souls_options @@ -60,6 +60,7 @@ class DarkSouls3World(World): "Cinders of a Lord - Lothric Prince" } } + item_descriptions = item_descriptions def __init__(self, multiworld: MultiWorld, player: int): diff --git a/worlds/dlcquest/__init__.py b/worlds/dlcquest/__init__.py index e4e0a29274da..c22b7cd9847b 100644 --- a/worlds/dlcquest/__init__.py +++ b/worlds/dlcquest/__init__.py @@ -3,7 +3,7 @@ from BaseClasses import Tutorial, CollectionState from worlds.AutoWorld import WebWorld, World from . import Options -from .Items import DLCQuestItem, ItemData, create_items, item_table +from .Items import DLCQuestItem, ItemData, create_items, item_table, items_by_group, Group from .Locations import DLCQuestLocation, location_table from .Options import DLCQuestOptions from .Regions import create_regions @@ -60,7 +60,9 @@ def create_items(self): created_items = create_items(self, self.options, locations_count + len(items_to_exclude), self.multiworld.random) self.multiworld.itempool += created_items - self.multiworld.early_items[self.player]["Movement Pack"] = 1 + + if self.options.campaign == Options.Campaign.option_basic or self.options.campaign == Options.Campaign.option_both: + self.multiworld.early_items[self.player]["Movement Pack"] = 1 for item in items_to_exclude: if item in self.multiworld.itempool: @@ -77,6 +79,10 @@ def create_item(self, item: Union[str, ItemData]) -> DLCQuestItem: return DLCQuestItem(item.name, item.classification, item.code, self.player) + def get_filler_item_name(self) -> str: + trap = self.multiworld.random.choice(items_by_group[Group.Trap]) + return trap.name + def fill_slot_data(self): options_dict = self.options.as_dict( "death_link", "ending_choice", "campaign", "coinsanity", "item_shuffle" diff --git a/worlds/factorio/Locations.py b/worlds/factorio/Locations.py index f9db5f4a2bd8..52f0954cba30 100644 --- a/worlds/factorio/Locations.py +++ b/worlds/factorio/Locations.py @@ -3,18 +3,13 @@ from .Technologies import factorio_base_id from .Options import MaxSciencePack -boundary: int = 0xff -total_locations: int = 0xff - -assert total_locations <= boundary - def make_pools() -> Dict[str, List[str]]: pools: Dict[str, List[str]] = {} for i, pack in enumerate(MaxSciencePack.get_ordered_science_packs(), start=1): - max_needed: int = 0xff + max_needed: int = 999 prefix: str = f"AP-{i}-" - pools[pack] = [prefix + hex(x)[2:].upper().zfill(2) for x in range(1, max_needed + 1)] + pools[pack] = [prefix + str(x).upper().zfill(3) for x in range(1, max_needed + 1)] return pools diff --git a/worlds/factorio/Mod.py b/worlds/factorio/Mod.py index 270e7dacf087..c897e72dcd11 100644 --- a/worlds/factorio/Mod.py +++ b/worlds/factorio/Mod.py @@ -5,7 +5,7 @@ import shutil import threading import zipfile -from typing import Optional, TYPE_CHECKING +from typing import Optional, TYPE_CHECKING, Any, List, Callable, Tuple import jinja2 @@ -24,6 +24,7 @@ data_final_template: Optional[jinja2.Template] = None locale_template: Optional[jinja2.Template] = None control_template: Optional[jinja2.Template] = None +settings_template: Optional[jinja2.Template] = None template_load_lock = threading.Lock() @@ -62,15 +63,24 @@ class FactorioModFile(worlds.Files.APContainer): game = "Factorio" compression_method = zipfile.ZIP_DEFLATED # Factorio can't load LZMA archives + writing_tasks: List[Callable[[], Tuple[str, str]]] + + def __init__(self, *args: Any, **kwargs: Any): + super().__init__(*args, **kwargs) + self.writing_tasks = [] def write_contents(self, opened_zipfile: zipfile.ZipFile): # directory containing Factorio mod has to come first, or Factorio won't recognize this file as a mod. mod_dir = self.path[:-4] # cut off .zip for root, dirs, files in os.walk(mod_dir): for file in files: - opened_zipfile.write(os.path.join(root, file), - os.path.relpath(os.path.join(root, file), + filename = os.path.join(root, file) + opened_zipfile.write(filename, + os.path.relpath(filename, os.path.join(mod_dir, '..'))) + for task in self.writing_tasks: + target, content = task() + opened_zipfile.writestr(target, content) # now we can add extras. super(FactorioModFile, self).write_contents(opened_zipfile) @@ -98,6 +108,7 @@ def load_template(name: str): locations = [(location, location.item) for location in world.science_locations] mod_name = f"AP-{multiworld.seed_name}-P{player}-{multiworld.get_file_safe_player_name(player)}" + versioned_mod_name = mod_name + "_" + Utils.__version__ random = multiworld.per_slot_randoms[player] @@ -153,48 +164,38 @@ def flop_random(low, high, base=None): template_data["free_sample_blacklist"].update({item: 1 for item in multiworld.free_sample_blacklist[player].value}) template_data["free_sample_blacklist"].update({item: 0 for item in multiworld.free_sample_whitelist[player].value}) - control_code = control_template.render(**template_data) - data_template_code = data_template.render(**template_data) - data_final_fixes_code = data_final_template.render(**template_data) - settings_code = settings_template.render(**template_data) + mod_dir = os.path.join(output_directory, versioned_mod_name) - mod_dir = os.path.join(output_directory, mod_name + "_" + Utils.__version__) - en_locale_dir = os.path.join(mod_dir, "locale", "en") - os.makedirs(en_locale_dir, exist_ok=True) + zf_path = os.path.join(mod_dir + ".zip") + mod = FactorioModFile(zf_path, player=player, player_name=multiworld.player_name[player]) if world.zip_path: - # Maybe investigate read from zip, write to zip, without temp file? with zipfile.ZipFile(world.zip_path) as zf: for file in zf.infolist(): if not file.is_dir() and "/data/mod/" in file.filename: path_part = Utils.get_text_after(file.filename, "/data/mod/") - target = os.path.join(mod_dir, path_part) - os.makedirs(os.path.split(target)[0], exist_ok=True) - - with open(target, "wb") as f: - f.write(zf.read(file)) + mod.writing_tasks.append(lambda arcpath=versioned_mod_name+"/"+path_part, content=zf.read(file): + (arcpath, content)) else: shutil.copytree(os.path.join(os.path.dirname(__file__), "data", "mod"), mod_dir, dirs_exist_ok=True) - with open(os.path.join(mod_dir, "data.lua"), "wt") as f: - f.write(data_template_code) - with open(os.path.join(mod_dir, "data-final-fixes.lua"), "wt") as f: - f.write(data_final_fixes_code) - with open(os.path.join(mod_dir, "control.lua"), "wt") as f: - f.write(control_code) - with open(os.path.join(mod_dir, "settings.lua"), "wt") as f: - f.write(settings_code) - locale_content = locale_template.render(**template_data) - with open(os.path.join(en_locale_dir, "locale.cfg"), "wt") as f: - f.write(locale_content) + mod.writing_tasks.append(lambda: (versioned_mod_name + "/data.lua", + data_template.render(**template_data))) + mod.writing_tasks.append(lambda: (versioned_mod_name + "/data-final-fixes.lua", + data_final_template.render(**template_data))) + mod.writing_tasks.append(lambda: (versioned_mod_name + "/control.lua", + control_template.render(**template_data))) + mod.writing_tasks.append(lambda: (versioned_mod_name + "/settings.lua", + settings_template.render(**template_data))) + mod.writing_tasks.append(lambda: (versioned_mod_name + "/locale/en/locale.cfg", + locale_template.render(**template_data))) + info = base_info.copy() info["name"] = mod_name - with open(os.path.join(mod_dir, "info.json"), "wt") as f: - json.dump(info, f, indent=4) + mod.writing_tasks.append(lambda: (versioned_mod_name + "/info.json", + json.dumps(info, indent=4))) - # zip the result - zf_path = os.path.join(mod_dir + ".zip") - mod = FactorioModFile(zf_path, player=player, player_name=multiworld.player_name[player]) + # write the mod file mod.write() - + # clean up shutil.rmtree(mod_dir) diff --git a/worlds/factorio/__init__.py b/worlds/factorio/__init__.py index 8308bb2d6559..eb078720c668 100644 --- a/worlds/factorio/__init__.py +++ b/worlds/factorio/__init__.py @@ -541,7 +541,7 @@ def __init__(self, player: int, name: str, address: int, parent: Region): super(FactorioScienceLocation, self).__init__(player, name, address, parent) # "AP-{Complexity}-{Cost}" self.complexity = int(self.name[3]) - 1 - self.rel_cost = int(self.name[5:], 16) + self.rel_cost = int(self.name[5:]) self.ingredients = {Factorio.ordered_science_packs[self.complexity]: 1} for complexity in range(self.complexity): diff --git a/worlds/factorio/data/mod/graphics/icons/ap.png b/worlds/factorio/data/mod/graphics/icons/ap.png index 8f0da105a19c..fa6b80cccafc 100644 Binary files a/worlds/factorio/data/mod/graphics/icons/ap.png and b/worlds/factorio/data/mod/graphics/icons/ap.png differ diff --git a/worlds/factorio/data/mod/graphics/icons/ap_unimportant.png b/worlds/factorio/data/mod/graphics/icons/ap_unimportant.png index 8471317a9379..68ee52a5e8e0 100644 Binary files a/worlds/factorio/data/mod/graphics/icons/ap_unimportant.png and b/worlds/factorio/data/mod/graphics/icons/ap_unimportant.png differ diff --git a/worlds/factorio/data/mod/info.json b/worlds/factorio/data/mod/info.json deleted file mode 100644 index 70a951834428..000000000000 --- a/worlds/factorio/data/mod/info.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "archipelago-client", - "version": "0.0.1", - "title": "Archipelago", - "author": "Berserker and Dewiniaid", - "homepage": "https://archipelago.gg", - "description": "Integration client for the Archipelago Randomizer", - "factorio_version": "1.1", - "dependencies": [ - "base >= 1.1.0", - "? science-not-invited", - "? factory-levels" - ] -} diff --git a/worlds/hylics2/__init__.py b/worlds/hylics2/__init__.py index 19d901bf5a05..1c51bacc5d67 100644 --- a/worlds/hylics2/__init__.py +++ b/worlds/hylics2/__init__.py @@ -2,7 +2,7 @@ from BaseClasses import Region, Entrance, Location, Item, Tutorial, ItemClassification from worlds.generic.Rules import set_rule from . import Exits, Items, Locations, Options, Rules -from ..AutoWorld import WebWorld, World +from worlds.AutoWorld import WebWorld, World class Hylics2Web(WebWorld): @@ -193,7 +193,7 @@ def create_regions(self) -> None: if j == i: for k in exits: # create entrance and connect it to parent and destination regions - ent = Entrance(self.player, k, reg) + ent = Entrance(self.player, f"{reg.name} {k}", reg) reg.exits.append(ent) if k == "New Game" and self.multiworld.random_start[self.player]: if self.start_location == "Waynehouse": diff --git a/worlds/lingo/LL1.yaml b/worlds/lingo/LL1.yaml new file mode 100644 index 000000000000..f8b07b86514b --- /dev/null +++ b/worlds/lingo/LL1.yaml @@ -0,0 +1,7534 @@ +--- + # This file is an associative array where the keys are region names. Rooms + # have four properties: entrances, panels, doors, and paintings. + # + # entrances is an array of regions from which this room can be accessed. The + # key of each entry is the room that can access this one. The value is a list + # of OR'd requirements for being able to access this room from the other one, + # although the list can be elided if there is only one requirement, and the + # value True can be used if there are no requirements (i.e. you always have + # access to this room if you have access to the other). Each requirement + # describes a door that must be opened in order to access this room from the + # other. The door is described by both the door's name and the name of the + # room that the door is in. The room name may be omitted if the door is + # located in the current room. + # + # panels is an array of panels in the room. The key of the array is an + # arbitrary name for the panel. Panels can have the following fields: + # - id: The internal ID of the panel in the LINGO map + # - required_room: In addition to having access to this room, the player must + # also have access to this other room in order to solve this + # panel. + # - required_door: In addition to having access to this room, the player must + # also have this door opened in order to solve this panel. + # - required_panel: In addition to having access to this room, the player must + # also be able to access this other panel in order to solve + # this panel. + # - colors: A list of colors that are required to be unlocked in order + # to solve this panel + # - check: A location check will be created for this individual panel. + # - exclude_reduce: Panel checks are assumed to be INCLUDED when reduce checks + # is on. This option excludes the check anyway. + # - tag: Label that describes how panel randomization should be + # done. In reorder mode, panels with the same tag can be + # shuffled amongst themselves. "forbid" is a special value + # meaning that no randomization should be done. This field is + # mandatory. + # - link: Panels with the same link label are randomized as a group. + # - subtag: Used to identify the separate parts of a linked group. + # - copy_to_sign: When randomizing this panel, the hint should be copied to + # the specified sign(s). + # - achievement: The name of the achievement that is received upon solving + # this panel. + # - non_counting: If True, this panel does not contribute to the total needed + # to unlock Level 2. + # + # doors is an array of doors associated with this room. When door + # randomization is enabled, each of these is an item. The key is a name that + # will be displayed as part of the item's name. Doors can have the following + # fields: + # - id: A string or list of internal door IDs from the LINGO map. + # In door shuffle mode, collecting the item generated for + # this door will open the doors listed here. + # - painting_id: An internal ID of a painting that should be moved upon + # receiving this door. + # - panels: These are the panels that canonically open this door. If + # there is only one panel for the door, then that panel is a + # check. If there is more than one panel, then that entire + # set of panels must be solved for a check. Panels can + # either be a string (representing a panel in this room) or + # a dict containing "room" and "panel". + # - item_name: Overrides the name of the item generated for this door. + # If not specified, the item name will be generated from + # the room name and the door name. + # - location_name: Overrides the name of the location generated for this + # door. If not specified, the location name will be + # generated using the names of the panels. + # - skip_location: If true, no location is generated for this door. + # - skip_item: If true, no item is generated for this door. + # - group: When simple doors is used, all doors with the same group + # will be covered by a single item. + # - include_reduce: Door checks are assumed to be EXCLUDED when reduce checks + # is on. This option includes the check anyway. + # - junk_item: If on, the item for this door will be considered a junk + # item instead of a progression item. Only use this for + # doors that could never gate progression regardless of + # options and state. + # - event: Denotes that the door is event only. This is similar to + # setting both skip_location and skip_item. + # + # paintings is an array of paintings in the room. This is used for painting + # shuffling. + # - id: The internal painting ID from the LINGO map. + # - enter_only: If true, painting shuffling will not place a warp exit on + # this painting. + # - exit_only: If true, painting shuffling will not place a warp entrance + # on this painting. + # - orientation: One of north/south/east/west. This is the direction that + # the player is facing when they are interacting with it, + # not the orientation of the painting itself. "North" is + # the direction the player faces at a new game, with the + # positive X axis to the right. + # - required_door: This door must be open for the painting to be usable as an + # entrance. If required_door is set, enter_only must be + # True. + # - required: Marks a painting as being the only entrance for a room, + # and thus it is required to be an exit when randomized. + # Use "required_when_no_doors" instead if it would be + # possible to enter the room without the painting in door + # shuffle mode. + # - req_blocked: Marks that a painting cannot be an entrance leading to a + # required painting. Paintings within a room that has a + # required painting are automatically req blocked. + # Use "req_blocked_when_no_doors" instead if it would be + # fine in door shuffle mode. + # - move: Denotes that the painting is able to move. + Starting Room: + entrances: + Menu: True + panels: + HI: + id: Entry Room/Panel_hi_hi + tag: midwhite + HIDDEN: + id: Entry Room/Panel_hidden_hidden + tag: midwhite + TYPE: + id: Entry Room/Panel_type_type + tag: midwhite + THIS: + id: Entry Room/Panel_this_this + tag: midwhite + WRITE: + id: Entry Room/Panel_write_write + tag: midwhite + SAME: + id: Entry Room/Panel_same_same + tag: midwhite + doors: + Main Door: + event: True + panels: + - HI + Back Right Door: + id: Entry Room Area Doors/Door_hidden_hidden + include_reduce: True + panels: + - HIDDEN + Rhyme Room Entrance: + id: + - Palindrome Room Area Doors/Door_level_level_2 + - Palindrome Room Area Doors/Door_racecar_racecar_2 + - Palindrome Room Area Doors/Door_solos_solos_2 + skip_location: True + group: Rhyme Room Doors + panels: + - room: The Tenacious + panel: LEVEL (Black) + - room: The Tenacious + panel: RACECAR (Black) + - room: The Tenacious + panel: SOLOS (Black) + paintings: + - id: arrows_painting + exit_only: True + orientation: south + - id: arrows_painting2 + disable: True + move: True + - id: arrows_painting3 + disable: True + move: True + - id: garden_painting_tower2 + enter_only: True + orientation: north + move: True + required_door: + room: Hedge Maze + door: Painting Shortcut + - id: flower_painting_8 + enter_only: True + orientation: north + move: True + required_door: + room: Courtyard + door: Painting Shortcut + - id: symmetry_painting_a_starter + enter_only: True + orientation: west + move: True + required_door: + room: The Wondrous (Doorknob) + door: Painting Shortcut + - id: pencil_painting6 + enter_only: True + orientation: east + move: True + required_door: + room: Outside The Bold + door: Painting Shortcut + - id: blueman_painting_3 + enter_only: True + orientation: east + move: True + required_door: + room: Outside The Undeterred + door: Painting Shortcut + - id: eyes_yellow_painting2 + enter_only: True + orientation: west + move: True + required_door: + room: Outside The Agreeable + door: Painting Shortcut + Hidden Room: + entrances: + Starting Room: + room: Starting Room + door: Back Right Door + The Seeker: + door: Seeker Entrance + Dead End Area: + door: Dead End Door + Knight Night (Outer Ring): + door: Knight Night Entrance + panels: + DEAD END: + id: Appendix Room/Panel_deadend_deadened + check: True + exclude_reduce: True + tag: topwhite + OPEN: + id: Heteronym Room/Panel_entrance_entrance + tag: midwhite + LIES: + id: Appendix Room/Panel_lies_lies + tag: midwhite + doors: + Dead End Door: + id: Appendix Room Area Doors/Door_rat_tar_2 + skip_location: true + group: Dead End Area Access + panels: + - room: Hub Room + panel: RAT + Knight Night Entrance: + id: Appendix Room Area Doors/Door_rat_tar_4 + skip_location: true + panels: + - room: Hub Room + panel: RAT + Seeker Entrance: + id: Entry Room Area Doors/Door_entrance_entrance + item_name: The Seeker - Entrance + panels: + - OPEN + Rhyme Room Entrance: + id: + - Appendix Room Area Doors/Door_rat_tar_3 + - Double Room Area Doors/Door_room_entry_stairs + skip_location: True + group: Rhyme Room Doors + panels: + - room: The Tenacious + panel: LEVEL (Black) + - room: The Tenacious + panel: RACECAR (Black) + - room: The Tenacious + panel: SOLOS (Black) + - room: Hub Room + panel: RAT + paintings: + - id: owl_painting + orientation: north + The Seeker: + entrances: + Hidden Room: + room: Hidden Room + door: Seeker Entrance + Pilgrim Room: + room: Pilgrim Room + door: Shortcut to The Seeker + panels: + Achievement: + id: Countdown Panels/Panel_seeker_seeker + required_room: Hidden Room + tag: forbid + check: True + achievement: The Seeker + BEAR: + id: Heteronym Room/Panel_bear_bear + tag: midwhite + MINE: + id: Heteronym Room/Panel_mine_mine + tag: double midwhite + subtag: left + link: exact MINE + MINE (2): + id: Heteronym Room/Panel_mine_mine_2 + tag: double midwhite + subtag: right + link: exact MINE + BOW: + id: Heteronym Room/Panel_bow_bow + tag: midwhite + DOES: + id: Heteronym Room/Panel_does_does + tag: midwhite + MOBILE: + id: Heteronym Room/Panel_mobile_mobile + tag: double midwhite + subtag: left + link: exact MOBILE + MOBILE (2): + id: Heteronym Room/Panel_mobile_mobile_2 + tag: double midwhite + subtag: right + link: exact MOBILE + DESERT: + id: Heteronym Room/Panel_desert_desert + tag: topmid white stack + subtag: mid + link: topmid DESERT + DESSERT: + id: Heteronym Room/Panel_desert_dessert + tag: topmid white stack + subtag: top + link: topmid DESERT + SOW: + id: Heteronym Room/Panel_sow_sow + tag: topmid white stack + subtag: mid + link: topmid SOW + SEW: + id: Heteronym Room/Panel_sow_so + tag: topmid white stack + subtag: top + link: topmid SOW + TO: + id: Heteronym Room/Panel_two_to + tag: double topwhite + subtag: left + link: hp TWO + TOO: + id: Heteronym Room/Panel_two_too + tag: double topwhite + subtag: right + link: hp TWO + WRITE: + id: Heteronym Room/Panel_write_right + tag: topwhite + EWE: + id: Heteronym Room/Panel_you_ewe + tag: topwhite + KNOT: + id: Heteronym Room/Panel_not_knot + tag: double topwhite + subtag: left + link: hp NOT + NAUGHT: + id: Heteronym Room/Panel_not_naught + tag: double topwhite + subtag: right + link: hp NOT + BEAR (2): + id: Heteronym Room/Panel_bear_bare + tag: topwhite + Second Room: + entrances: + Starting Room: + room: Starting Room + door: Main Door + Hub Room: + door: Exit Door + panels: + HI: + id: Entry Room/Panel_hi_high + tag: topwhite + LOW: + id: Entry Room/Panel_low_low + tag: forbid # This is a midwhite pretending to be a botwhite + ANOTHER TRY: + id: Entry Room/Panel_advance + tag: topwhite + LEVEL 2: + # We will set up special rules for this in code. + id: EndPanel/Panel_level_2 + tag: forbid + non_counting: True + check: True + required_panel: + - panel: ANOTHER TRY + doors: + Exit Door: + id: Entry Room Area Doors/Door_hi_high + location_name: Second Room - Good Luck + include_reduce: True + panels: + - HI + - LOW + Hub Room: + entrances: + Second Room: + room: Second Room + door: Exit Door + Dead End Area: + door: Near RAT Door + Crossroads: + door: Crossroads Entrance + The Tenacious: + door: Tenacious Entrance + Warts Straw Area: + door: Symmetry Door + Hedge Maze: + door: Shortcut to Hedge Maze + Orange Tower First Floor: + room: Orange Tower First Floor + door: Shortcut to Hub Room + Owl Hallway: + painting: True + Outside The Initiated: + room: Outside The Initiated + door: Shortcut to Hub Room + The Traveled: + door: Traveled Entrance + Roof: True # through the sunwarp + Outside The Undeterred: # (NOTE: used in hardcoded pilgrimage) + room: Outside The Undeterred + door: Green Painting + painting: True + panels: + ORDER: + id: Shuffle Room/Panel_order_chaos + colors: black + tag: botblack + SLAUGHTER: + id: Palindrome Room/Panel_slaughter_laughter + colors: red + tag: midred + NEAR: + id: Symmetry Room/Panel_near_far + colors: black + tag: botblack + FAR: + id: Symmetry Room/Panel_far_near + colors: black + tag: botblack + TRACE: + id: Maze Room/Panel_trace_trace + tag: midwhite + RAT: + id: Appendix Room/Panel_rat_tar + colors: black + check: True + exclude_reduce: True + tag: midblack + OPEN: + id: Synonym Room/Panel_open_open + tag: midwhite + FOUR: + id: Backside Room/Panel_four_four_3 + tag: midwhite + required_door: + room: Outside The Undeterred + door: Fours + LOST: + id: Shuffle Room/Panel_lost_found + colors: black + tag: botblack + FORWARD: + id: Entry Room/Panel_forward_forward + tag: midwhite + BETWEEN: + id: Entry Room/Panel_between_between + tag: midwhite + BACKWARD: + id: Entry Room/Panel_backward_backward + tag: midwhite + doors: + Crossroads Entrance: + id: Shuffle Room Area Doors/Door_chaos + panels: + - ORDER + Tenacious Entrance: + id: Palindrome Room Area Doors/Door_slaughter_laughter + group: Entrances to The Tenacious + panels: + - SLAUGHTER + Symmetry Door: + id: + - Symmetry Room Area Doors/Door_near_far + - Symmetry Room Area Doors/Door_far_near + group: Symmetry Doors + panels: + - NEAR + - FAR + Shortcut to Hedge Maze: + id: Maze Area Doors/Door_trace_trace + group: Hedge Maze Doors + panels: + - TRACE + Near RAT Door: + id: Appendix Room Area Doors/Door_deadend_deadened + skip_location: True + group: Dead End Area Access + panels: + - room: Hidden Room + panel: DEAD END + Traveled Entrance: + id: Appendix Room Area Doors/Door_open_open + item_name: The Traveled - Entrance + group: Entrance to The Traveled + panels: + - OPEN + Lost Door: + id: Shuffle Room Area Doors/Door_lost_found + junk_item: True + panels: + - LOST + paintings: + - id: maze_painting + orientation: west + Dead End Area: + entrances: + Hidden Room: + room: Hidden Room + door: Dead End Door + Hub Room: + room: Hub Room + door: Near RAT Door + panels: + FOUR: + id: Backside Room/Panel_four_four_2 + tag: midwhite + required_door: + room: Outside The Undeterred + door: Fours + EIGHT: + id: Backside Room/Panel_eight_eight_8 + tag: midwhite + required_door: + room: Number Hunt + door: Eights + paintings: + - id: smile_painting_6 + orientation: north + Pilgrim Antechamber: + # Let's not shuffle the paintings yet. + entrances: + # The pilgrimage is hardcoded in rules.py + Starting Room: + door: Sun Painting + panels: + HOT CRUST: + id: Lingo Room/Panel_shortcut + colors: yellow + tag: midyellow + PILGRIMAGE: + id: Lingo Room/Panel_pilgrim + colors: blue + tag: midblue + MASTERY: + id: Master Room/Panel_mastery_mastery14 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + doors: + Sun Painting: + item_name: Pilgrim Room - Sun Painting + location_name: Pilgrim Room - HOT CRUST + painting_id: pilgrim_painting2 + panels: + - HOT CRUST + Exit: + event: True + panels: + - PILGRIMAGE + Pilgrim Room: + entrances: + The Seeker: + door: Shortcut to The Seeker + Pilgrim Antechamber: + room: Pilgrim Antechamber + door: Exit + panels: + THIS: + id: Lingo Room/Panel_lingo_9 + colors: gray + tag: forbid + TIME ROOM: + id: Lingo Room/Panel_lingo_1 + colors: purple + tag: toppurp + SCIENCE ROOM: + id: Lingo Room/Panel_lingo_2 + tag: botwhite + SHINY ROCK ROOM: + id: Lingo Room/Panel_lingo_3 + tag: botwhite + ANGRY POWER: + id: Lingo Room/Panel_lingo_4 + colors: + - purple + tag: forbid + MICRO LEGION: + id: Lingo Room/Panel_lingo_5 + colors: yellow + tag: midyellow + LOSERS RELAX: + id: Lingo Room/Panel_lingo_6 + colors: + - black + tag: forbid + "906234": + id: Lingo Room/Panel_lingo_7 + colors: + - orange + - blue + tag: forbid + MOOR EMORDNILAP: + id: Lingo Room/Panel_lingo_8 + colors: black + tag: midblack + HALL ROOMMATE: + id: Lingo Room/Panel_lingo_10 + colors: + - red + - blue + tag: forbid + ALL GREY: + id: Lingo Room/Panel_lingo_11 + colors: yellow + tag: midyellow + PLUNDER ISLAND: + id: Lingo Room/Panel_lingo_12 + colors: + - purple + - red + tag: forbid + FLOSS PATHS: + id: Lingo Room/Panel_lingo_13 + colors: + - purple + - brown + tag: forbid + doors: + Shortcut to The Seeker: + id: Master Room Doors/Door_pilgrim_shortcut + include_reduce: True + panels: + - THIS + Crossroads: + entrances: + Hub Room: True # The sunwarp means that we never need the ORDER door + Color Hallways: True + The Tenacious: + door: Tenacious Entrance + Orange Tower Fourth Floor: True # through IRK HORN + Amen Name Area: + room: Lost Area + door: Exit + Roof: True # through the sunwarp + panels: + DECAY: + id: Palindrome Room/Panel_decay_day + colors: red + tag: midred + NOPE: + id: Sun Room/Panel_nope_open + colors: yellow + tag: midyellow + EIGHT: + id: Backside Room/Panel_eight_eight_5 + tag: midwhite + required_door: + room: Number Hunt + door: Eights + WE ROT: + id: Shuffle Room/Panel_tower + colors: yellow + tag: midyellow + WORDS: + id: Shuffle Room/Panel_words_sword + colors: yellow + tag: midyellow + SWORD: + id: Shuffle Room/Panel_sword_words + colors: yellow + tag: midyellow + TURN: + id: Shuffle Room/Panel_turn_runt + colors: yellow + tag: midyellow + BEND HI: + id: Shuffle Room/Panel_behind + colors: yellow + tag: midyellow + THE EYES: + id: Shuffle Room/Panel_eyes_see_shuffle + colors: yellow + check: True + exclude_reduce: True + required_door: + door: Hollow Hallway + tag: midyellow + CORNER: + id: Shuffle Room/Panel_corner_corner + required_door: + door: Hollow Hallway + tag: midwhite + HOLLOW: + id: Shuffle Room/Panel_hollow_hollow + required_door: + door: Hollow Hallway + tag: midwhite + SWAP: + id: Shuffle Room/Panel_swap_wasp + colors: yellow + tag: midyellow + GEL: + id: Shuffle Room/Panel_gel + colors: yellow + tag: topyellow + required_door: + door: Tower Entrance + THOUGH: + id: Shuffle Room/Panel_though + colors: yellow + tag: topyellow + required_door: + door: Tower Entrance + CROSSROADS: + id: Shuffle Room/Panel_crossroads_crossroads + tag: midwhite + doors: + Tenacious Entrance: + id: Palindrome Room Area Doors/Door_decay_day + group: Entrances to The Tenacious + panels: + - DECAY + Discerning Entrance: + id: Shuffle Room Area Doors/Door_nope_open + item_name: The Discerning - Entrance + panels: + - NOPE + Tower Entrance: + id: + - Shuffle Room Area Doors/Door_tower + - Shuffle Room Area Doors/Door_tower2 + - Shuffle Room Area Doors/Door_tower3 + - Shuffle Room Area Doors/Door_tower4 + group: Crossroads - Tower Entrances + panels: + - WE ROT + Tower Back Entrance: + id: Shuffle Room Area Doors/Door_runt + location_name: Crossroads - TURN/RUNT + group: Crossroads - Tower Entrances + panels: + - TURN + - room: Orange Tower Fourth Floor + panel: RUNT + Words Sword Door: + id: + - Shuffle Room Area Doors/Door_words_shuffle_3 + - Shuffle Room Area Doors/Door_words_shuffle_4 + group: Crossroads Doors + panels: + - WORDS + - SWORD + Eye Wall: + id: Shuffle Room Area Doors/Door_behind + junk_item: True + group: Crossroads Doors + panels: + - BEND HI + Hollow Hallway: + id: Shuffle Room Area Doors/Door_crossroads6 + skip_location: True + group: Crossroads Doors + panels: + - BEND HI + Roof Access: + id: Tower Room Area Doors/Door_level_6_2 + skip_location: True + panels: + - room: Orange Tower First Floor + panel: DADS + ALE + - room: Outside The Undeterred + panel: ART + ART + - room: Orange Tower Third Floor + panel: DEER + WREN + - room: Orange Tower Fourth Floor + panel: LEARNS + UNSEW + - room: Orange Tower Fifth Floor + panel: DRAWL + RUNS + - room: Owl Hallway + panel: READS + RUST + paintings: + - id: eye_painting + disable: True + orientation: east + move: True + required_door: + door: Eye Wall + - id: smile_painting_4 + orientation: south + Lost Area: + entrances: + Outside The Agreeable: + door: Exit + Crossroads: + room: Crossroads + door: Words Sword Door + panels: + LOST (1): + id: Shuffle Room/Panel_lost_lots + colors: yellow + tag: midyellow + LOST (2): + id: Shuffle Room/Panel_lost_slot + colors: yellow + tag: midyellow + doors: + Exit: + id: + - Shuffle Room Area Doors/Door_lost_shuffle_1 + - Shuffle Room Area Doors/Door_lost_shuffle_2 + location_name: Crossroads - LOST Pair + panels: + - LOST (1) + - LOST (2) + Amen Name Area: + entrances: + Crossroads: + room: Lost Area + door: Exit + Suits Area: + door: Exit + panels: + AMEN: + id: Shuffle Room/Panel_amen_mean + colors: yellow + tag: double midyellow + subtag: left + link: ana MEAN + NAME: + id: Shuffle Room/Panel_name_mean + colors: yellow + tag: double midyellow + subtag: right + link: ana MEAN + NINE: + id: Backside Room/Panel_nine_nine_3 + tag: midwhite + required_door: + room: Number Hunt + door: Nines + doors: + Exit: + id: Shuffle Room Area Doors/Door_mean + panels: + - AMEN + - NAME + Suits Area: + entrances: + Amen Name Area: + room: Amen Name Area + door: Exit + Roof: True + panels: + SPADES: + id: Cross Room/Panel_spades_spades + tag: midwhite + CLUBS: + id: Cross Room/Panel_clubs_clubs + tag: midwhite + HEARTS: + id: Cross Room/Panel_hearts_hearts + tag: midwhite + paintings: + - id: west_afar + orientation: south + The Tenacious: + entrances: + Hub Room: + - room: Hub Room + door: Tenacious Entrance + - door: Shortcut to Hub Room + Crossroads: + room: Crossroads + door: Tenacious Entrance + Outside The Agreeable: + room: Outside The Agreeable + door: Tenacious Entrance + Dread Hallway: + room: Dread Hallway + door: Tenacious Entrance + panels: + LEVEL (Black): + id: Palindrome Room/Panel_level_level + colors: black + tag: midblack + RACECAR (Black): + id: Palindrome Room/Panel_racecar_racecar + colors: black + tag: palindrome + copy_to_sign: sign4 + SOLOS (Black): + id: Palindrome Room/Panel_solos_solos + colors: black + tag: palindrome + copy_to_sign: + - sign5 + - sign6 + LEVEL (White): + id: Palindrome Room/Panel_level_level_2 + tag: midwhite + RACECAR (White): + id: Palindrome Room/Panel_racecar_racecar_2 + tag: midwhite + copy_to_sign: sign3 + SOLOS (White): + id: Palindrome Room/Panel_solos_solos_2 + tag: midwhite + copy_to_sign: + - sign1 + - sign2 + Achievement: + id: Countdown Panels/Panel_tenacious_tenacious + check: True + tag: forbid + required_panel: + - panel: LEVEL (Black) + - panel: RACECAR (Black) + - panel: SOLOS (Black) + - panel: LEVEL (White) + - panel: RACECAR (White) + - panel: SOLOS (White) + - room: Hub Room + panel: SLAUGHTER + - room: Crossroads + panel: DECAY + - room: Outside The Agreeable + panel: MASSACRED + - room: Dread Hallway + panel: DREAD + achievement: The Tenacious + doors: + Shortcut to Hub Room: + id: + - Palindrome Room Area Doors/Door_level_level_1 + - Palindrome Room Area Doors/Door_racecar_racecar_1 + - Palindrome Room Area Doors/Door_solos_solos_1 + location_name: The Tenacious - Palindromes + group: Entrances to The Tenacious + panels: + - LEVEL (Black) + - RACECAR (Black) + - SOLOS (Black) + White Palindromes: + location_name: The Tenacious - White Palindromes + skip_item: True + panels: + - LEVEL (White) + - RACECAR (White) + - SOLOS (White) + Warts Straw Area: + entrances: + Hub Room: + room: Hub Room + door: Symmetry Door + Leaf Feel Area: + door: Door + panels: + WARTS: + id: Symmetry Room/Panel_warts_straw + colors: black + tag: midblack + STRAW: + id: Symmetry Room/Panel_straw_warts + colors: black + tag: midblack + doors: + Door: + id: + - Symmetry Room Area Doors/Door_warts_straw + - Symmetry Room Area Doors/Door_straw_warts + group: Symmetry Doors + panels: + - WARTS + - STRAW + Leaf Feel Area: + entrances: + Warts Straw Area: + room: Warts Straw Area + door: Door + Outside The Agreeable: + door: Door + panels: + LEAF: + id: Symmetry Room/Panel_leaf_feel + colors: black + tag: topblack + FEEL: + id: Symmetry Room/Panel_feel_leaf + colors: black + tag: topblack + doors: + Door: + id: + - Symmetry Room Area Doors/Door_leaf_feel + - Symmetry Room Area Doors/Door_feel_leaf + group: Symmetry Doors + panels: + - LEAF + - FEEL + Outside The Agreeable: + # Let's ignore the blue warp thing for now because the lookout is a dead + # end. Later on it could be filler checks. + entrances: + # We don't have to list Lost Area because of Crossroads. + Crossroads: True + The Tenacious: + door: Tenacious Entrance + The Agreeable: + door: Agreeable Entrance + Dread Hallway: + door: Black Door + Leaf Feel Area: + room: Leaf Feel Area + door: Door + Starting Room: + door: Painting Shortcut + painting: True + Hallway Room (2): True + Hallway Room (3): True + Hallway Room (4): True + Hedge Maze: True # through the door to the sectioned-off part of the hedge maze + panels: + MASSACRED: + id: Palindrome Room/Panel_massacred_sacred + colors: red + tag: midred + BLACK: + id: Symmetry Room/Panel_black_white + colors: black + tag: botblack + CLOSE: + id: Antonym Room/Panel_close_open + colors: black + tag: botblack + LEFT: + id: Symmetry Room/Panel_left_right + colors: black + tag: botblack + LEFT (2): + id: Symmetry Room/Panel_left_wrong + colors: black + tag: bot black black + RIGHT: + id: Symmetry Room/Panel_right_left + colors: black + tag: botblack + PURPLE: + id: Color Arrow Room/Panel_purple_afar + tag: midwhite + required_door: + door: Purple Barrier + FIVE (1): + id: Backside Room/Panel_five_five_5 + tag: midwhite + required_door: + room: Outside The Undeterred + door: Fives + FIVE (2): + id: Backside Room/Panel_five_five_4 + tag: midwhite + required_door: + room: Outside The Undeterred + door: Fives + OUT: + id: Hallway Room/Panel_out_out + check: True + exclude_reduce: True + tag: midwhite + HIDE: + id: Maze Room/Panel_hide_seek_4 + colors: black + tag: botblack + DAZE: + id: Maze Room/Panel_daze_maze + colors: purple + tag: midpurp + WALL: + id: Hallway Room/Panel_castle_1 + colors: blue + tag: quad bot blue + link: qbb CASTLE + KEEP: + id: Hallway Room/Panel_castle_2 + colors: blue + tag: quad bot blue + link: qbb CASTLE + BAILEY: + id: Hallway Room/Panel_castle_3 + colors: blue + tag: quad bot blue + link: qbb CASTLE + TOWER: + id: Hallway Room/Panel_castle_4 + colors: blue + tag: quad bot blue + link: qbb CASTLE + NORTH: + id: Cross Room/Panel_north_missing + colors: green + tag: forbid + required_room: Outside The Bold + DIAMONDS: + id: Cross Room/Panel_diamonds_missing + colors: green + tag: forbid + required_room: Suits Area + FIRE: + id: Cross Room/Panel_fire_missing + colors: green + tag: forbid + required_room: Elements Area + WINTER: + id: Cross Room/Panel_winter_missing + colors: green + tag: forbid + required_room: Orange Tower Fifth Floor + doors: + Tenacious Entrance: + id: Palindrome Room Area Doors/Door_massacred_sacred + group: Entrances to The Tenacious + panels: + - MASSACRED + Black Door: + id: Symmetry Room Area Doors/Door_black_white + group: Entrances to The Tenacious + panels: + - BLACK + Agreeable Entrance: + id: Symmetry Room Area Doors/Door_close_open + item_name: The Agreeable - Entrance + panels: + - CLOSE + Painting Shortcut: + item_name: Starting Room - Street Painting + painting_id: eyes_yellow_painting2 + panels: + - RIGHT + Purple Barrier: + id: Color Arrow Room Doors/Door_purple_3 + group: Color Hunt Barriers + skip_location: True + panels: + - room: Champion's Rest + panel: PURPLE + Hallway Door: + id: Red Blue Purple Room Area Doors/Door_room_2 + group: Hallway Room Doors + location_name: Hallway Room - First Room + panels: + - WALL + - KEEP + - BAILEY + - TOWER + paintings: + - id: panda_painting + orientation: south + - id: eyes_yellow_painting + orientation: east + progression: + Progressive Hallway Room: + - Hallway Door + - room: Hallway Room (2) + door: Exit + - room: Hallway Room (3) + door: Exit + - room: Hallway Room (4) + door: Exit + Dread Hallway: + entrances: + Outside The Agreeable: + room: Outside The Agreeable + door: Black Door + The Tenacious: + door: Tenacious Entrance + panels: + DREAD: + id: Palindrome Room/Panel_dread_dead + colors: red + tag: midred + doors: + Tenacious Entrance: + id: Palindrome Room Area Doors/Door_dread_dead + group: Entrances to The Tenacious + panels: + - DREAD + The Agreeable: + entrances: + Outside The Agreeable: + room: Outside The Agreeable + door: Agreeable Entrance + Hedge Maze: + door: Shortcut to Hedge Maze + panels: + Achievement: + id: Countdown Panels/Panel_disagreeable_agreeable + colors: black + tag: forbid + required_room: Outside The Agreeable + check: True + achievement: The Agreeable + BYE: + id: Antonym Room/Panel_bye_hi + colors: black + tag: botblack + RETOOL: + id: Antonym Room/Panel_retool_looter + colors: black + tag: midblack + DRAWER: + id: Antonym Room/Panel_drawer_reward + colors: black + tag: midblack + READ: + id: Antonym Room/Panel_read_write + colors: black + tag: botblack + DIFFERENT: + id: Antonym Room/Panel_different_same + colors: black + tag: botblack + LOW: + id: Antonym Room/Panel_low_high + colors: black + tag: botblack + ALIVE: + id: Antonym Room/Panel_alive_dead + colors: black + tag: botblack + THAT: + id: Antonym Room/Panel_that_this + colors: black + tag: botblack + STRESSED: + id: Antonym Room/Panel_stressed_desserts + colors: black + tag: midblack + STAR: + id: Antonym Room/Panel_star_rats + colors: black + tag: midblack + TAME: + id: Antonym Room/Panel_tame_mate + colors: black + tag: topblack + CAT: + id: Antonym Room/Panel_cat_tack + colors: black + tag: topblack + doors: + Shortcut to Hedge Maze: + id: Symmetry Room Area Doors/Door_bye_hi + group: Hedge Maze Doors + panels: + - BYE + Hedge Maze: + entrances: + Hub Room: + room: Hub Room + door: Shortcut to Hedge Maze + Color Hallways: True + The Agreeable: + room: The Agreeable + door: Shortcut to Hedge Maze + The Perceptive: True + The Observant: + door: Observant Entrance + Owl Hallway: + room: Owl Hallway + door: Shortcut to Hedge Maze + Roof: True + panels: + DOWN: + id: Maze Room/Panel_down_up + colors: black + tag: botblack + HIDE (1): + id: Maze Room/Panel_hide_seek + colors: black + tag: botblack + HIDE (2): + id: Maze Room/Panel_hide_seek_2 + colors: black + tag: botblack + HIDE (3): + id: Maze Room/Panel_hide_seek_3 + colors: black + tag: botblack + MASTERY (1): + id: Master Room/Panel_mastery_mastery5 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + MASTERY (2): + id: Master Room/Panel_mastery_mastery9 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + PATH (1): + id: Maze Room/Panel_path_lock + colors: green + tag: forbid + PATH (2): + id: Maze Room/Panel_path_knot + colors: green + tag: forbid + PATH (3): + id: Maze Room/Panel_path_lost + colors: green + tag: forbid + PATH (4): + id: Maze Room/Panel_path_open + colors: green + tag: forbid + PATH (5): + id: Maze Room/Panel_path_help + colors: green + tag: forbid + PATH (6): + id: Maze Room/Panel_path_hunt + colors: green + tag: forbid + PATH (7): + id: Maze Room/Panel_path_nest + colors: green + tag: forbid + PATH (8): + id: Maze Room/Panel_path_look + colors: green + tag: forbid + REFLOW: + id: Maze Room/Panel_reflow_flower + colors: yellow + tag: midyellow + LEAP: + id: Maze Room/Panel_leap_jump + tag: botwhite + doors: + Perceptive Entrance: + id: Maze Area Doors/Door_maze_maze + item_name: The Perceptive - Entrance + group: Hedge Maze Doors + panels: + - DOWN + Painting Shortcut: + painting_id: garden_painting_tower2 + item_name: Starting Room - Hedge Maze Painting + skip_location: True + panels: + - DOWN + Observant Entrance: + id: + - Maze Area Doors/Door_look_room_1 + - Maze Area Doors/Door_look_room_2 + - Maze Area Doors/Door_look_room_3 + skip_location: True + item_name: The Observant - Entrance + group: Observant Doors + panels: + - room: The Perceptive + panel: GAZE + Hide and Seek: + skip_item: True + location_name: Hedge Maze - Hide and Seek + include_reduce: True + panels: + - HIDE (1) + - HIDE (2) + - HIDE (3) + - room: Outside The Agreeable + panel: HIDE + The Perceptive: + entrances: + Starting Room: + room: Hedge Maze + door: Painting Shortcut + painting: True + Hedge Maze: + room: Hedge Maze + door: Perceptive Entrance + panels: + Achievement: + id: Countdown Panels/Panel_perceptive_perceptive + colors: green + tag: forbid + check: True + achievement: The Perceptive + GAZE: + id: Maze Room/Panel_look_look + check: True + exclude_reduce: True + tag: botwhite + paintings: + - id: garden_painting_tower + orientation: north + The Fearless (First Floor): + entrances: + The Perceptive: True + panels: + NAPS: + id: Naps Room/Panel_naps_span + colors: black + tag: midblack + TEAM: + id: Naps Room/Panel_team_meet + colors: black + tag: topblack + TEEM: + id: Naps Room/Panel_teem_meat + colors: black + tag: topblack + IMPATIENT: + id: Naps Room/Panel_impatient_doctor + colors: black + tag: bot black black + EAT: + id: Naps Room/Panel_eat_tea + colors: black + tag: topblack + doors: + Second Floor: + id: Naps Room Doors/Door_hider_5 + location_name: The Fearless - First Floor Puzzles + group: Fearless Doors + panels: + - NAPS + - TEAM + - TEEM + - IMPATIENT + - EAT + progression: + Progressive Fearless: + - Second Floor + - room: The Fearless (Second Floor) + door: Third Floor + The Fearless (Second Floor): + entrances: + The Fearless (First Floor): + room: The Fearless (First Floor) + door: Second Floor + panels: + NONE: + id: Naps Room/Panel_one_many + colors: black + tag: bot black top white + SUM: + id: Naps Room/Panel_one_none + colors: black + tag: top white bot black + FUNNY: + id: Naps Room/Panel_funny_enough + colors: black + tag: topblack + MIGHT: + id: Naps Room/Panel_might_time + colors: black + tag: topblack + SAFE: + id: Naps Room/Panel_safe_face + colors: black + tag: topblack + SAME: + id: Naps Room/Panel_same_mace + colors: black + tag: topblack + CAME: + id: Naps Room/Panel_came_make + colors: black + tag: topblack + doors: + Third Floor: + id: + - Naps Room Doors/Door_hider_1b2 + - Naps Room Doors/Door_hider_new1 + location_name: The Fearless - Second Floor Puzzles + group: Fearless Doors + panels: + - NONE + - SUM + - FUNNY + - MIGHT + - SAFE + - SAME + - CAME + The Fearless: + entrances: + The Fearless (First Floor): + room: The Fearless (Second Floor) + door: Third Floor + panels: + Achievement: + id: Countdown Panels/Panel_fearless_fearless + colors: black + tag: forbid + check: True + achievement: The Fearless + EASY: + id: Naps Room/Panel_easy_soft + colors: black + tag: bot black black + SOMETIMES: + id: Naps Room/Panel_sometimes_always + colors: black + tag: bot black black + DARK: + id: Naps Room/Panel_dark_extinguish + colors: black + tag: bot black black + EVEN: + id: Naps Room/Panel_even_ordinary + colors: black + tag: bot black black + The Observant: + entrances: + Hedge Maze: + room: Hedge Maze + door: Observant Entrance + The Incomparable: True + panels: + Achievement: + id: Countdown Panels/Panel_observant_observant + colors: green + check: True + tag: forbid + required_door: + door: Stairs + achievement: The Observant + BACK: + id: Look Room/Panel_four_back + colors: green + tag: forbid + SIDE: + id: Look Room/Panel_four_side + colors: green + tag: forbid + BACKSIDE: + id: Backside Room/Panel_backside_2 + tag: midwhite + required_door: + door: Backside Door + STAIRS: + id: Look Room/Panel_six_stairs + colors: green + tag: forbid + WAYS: + id: Look Room/Panel_four_ways + colors: green + tag: forbid + "ON": + id: Look Room/Panel_two_on + colors: green + tag: forbid + UP: + id: Look Room/Panel_two_up + colors: green + tag: forbid + SWIMS: + id: Look Room/Panel_five_swims + colors: green + tag: forbid + UPSTAIRS: + id: Look Room/Panel_eight_upstairs + colors: green + tag: forbid + required_door: + door: Stairs + TOIL: + id: Look Room/Panel_blue_toil + colors: green + tag: forbid + required_door: + door: Stairs + STOP: + id: Look Room/Panel_four_stop + colors: green + tag: forbid + required_door: + door: Stairs + TOP: + id: Look Room/Panel_aqua_top + colors: green + tag: forbid + required_door: + door: Stairs + HI: + id: Look Room/Panel_blue_hi + colors: green + tag: forbid + required_door: + door: Stairs + HI (2): + id: Look Room/Panel_blue_hi2 + colors: green + tag: forbid + required_door: + door: Stairs + "31": + id: Look Room/Panel_numbers_31 + colors: green + tag: forbid + required_door: + door: Stairs + "52": + id: Look Room/Panel_numbers_52 + colors: green + tag: forbid + required_door: + door: Stairs + OIL: + id: Look Room/Panel_aqua_oil + colors: green + tag: forbid + required_door: + door: Stairs + BACKSIDE (GREEN): + id: Look Room/Panel_eight_backside + colors: green + tag: forbid + required_door: + door: Stairs + SIDEWAYS: + id: Look Room/Panel_eight_sideways + colors: green + tag: forbid + required_door: + door: Stairs + doors: + Backside Door: + id: Maze Area Doors/Door_backside + group: Backside Doors + panels: + - BACK + - SIDE + Stairs: + id: Maze Area Doors/Door_stairs + group: Observant Doors + panels: + - STAIRS + The Incomparable: + entrances: + The Observant: True # Assuming that access to The Observant includes access to the right entrance + Eight Room: True + Eight Alcove: + door: Eight Door + Orange Tower Sixth Floor: + painting: True + panels: + Achievement: + id: Countdown Panels/Panel_incomparable_incomparable + colors: blue + check: True + tag: forbid + required_room: + - Elements Area + - Courtyard + - Eight Room + achievement: The Incomparable + A (One): + id: Strand Room/Panel_blank_a + colors: blue + tag: forbid + A (Two): + id: Strand Room/Panel_a_an + colors: blue + tag: forbid + A (Three): + id: Strand Room/Panel_a_and + colors: blue + tag: forbid + A (Four): + id: Strand Room/Panel_a_sand + colors: blue + tag: forbid + A (Five): + id: Strand Room/Panel_a_stand + colors: blue + tag: forbid + A (Six): + id: Strand Room/Panel_a_strand + colors: blue + tag: forbid + I (One): + id: Strand Room/Panel_blank_i + colors: blue + tag: forbid + I (Two): + id: Strand Room/Panel_i_in + colors: blue + tag: forbid + I (Three): + id: Strand Room/Panel_i_sin + colors: blue + tag: forbid + I (Four): + id: Strand Room/Panel_i_sing + colors: blue + tag: forbid + I (Five): + id: Strand Room/Panel_i_sting + colors: blue + tag: forbid + I (Six): + id: Strand Room/Panel_i_string + colors: blue + tag: forbid + I (Seven): + id: Strand Room/Panel_i_strings + colors: blue + tag: forbid + doors: + Eight Door: + id: Red Blue Purple Room Area Doors/Door_a_strands + location_name: Giant Sevens + group: Observant Doors + panels: + - I (Seven) + - room: Courtyard + panel: I + - room: Elements Area + panel: A + paintings: + - id: crown_painting + orientation: east + Eight Alcove: + entrances: + The Incomparable: + room: The Incomparable + door: Eight Door + Outside The Initiated: + room: Outside The Initiated + door: Eight Door + paintings: + - id: eight_painting2 + orientation: north + Eight Room: + entrances: + Eight Alcove: + painting: True + panels: + Eight Back: + id: Strand Room/Panel_i_starling + colors: blue + tag: forbid + Eight Front: + id: Strand Room/Panel_i_starting + colors: blue + tag: forbid + Nine: + id: Strand Room/Panel_i_startling + colors: blue + tag: forbid + paintings: + - id: eight_painting + orientation: south + exit_only: True + required: True + Orange Tower: + # This is a special, meta-ish room. + entrances: + Menu: True + doors: + Second Floor: + id: Tower Room Area Doors/Door_level_1 + skip_location: True + panels: + - room: Orange Tower First Floor + panel: DADS + ALE + Third Floor: + id: Tower Room Area Doors/Door_level_2 + skip_location: True + panels: + - room: Orange Tower First Floor + panel: DADS + ALE + - room: Outside The Undeterred + panel: ART + ART + Fourth Floor: + id: Tower Room Area Doors/Door_level_3 + skip_location: True + panels: + - room: Orange Tower First Floor + panel: DADS + ALE + - room: Outside The Undeterred + panel: ART + ART + - room: Orange Tower Third Floor + panel: DEER + WREN + Fifth Floor: + id: Tower Room Area Doors/Door_level_4 + skip_location: True + panels: + - room: Orange Tower First Floor + panel: DADS + ALE + - room: Outside The Undeterred + panel: ART + ART + - room: Orange Tower Third Floor + panel: DEER + WREN + - room: Orange Tower Fourth Floor + panel: LEARNS + UNSEW + Sixth Floor: + id: Tower Room Area Doors/Door_level_5 + skip_location: True + panels: + - room: Orange Tower First Floor + panel: DADS + ALE + - room: Outside The Undeterred + panel: ART + ART + - room: Orange Tower Third Floor + panel: DEER + WREN + - room: Orange Tower Fourth Floor + panel: LEARNS + UNSEW + - room: Orange Tower Fifth Floor + panel: DRAWL + RUNS + Seventh Floor: + id: Tower Room Area Doors/Door_level_6 + skip_location: True + panels: + - room: Orange Tower First Floor + panel: DADS + ALE + - room: Outside The Undeterred + panel: ART + ART + - room: Orange Tower Third Floor + panel: DEER + WREN + - room: Orange Tower Fourth Floor + panel: LEARNS + UNSEW + - room: Orange Tower Fifth Floor + panel: DRAWL + RUNS + - room: Owl Hallway + panel: READS + RUST + progression: + Progressive Orange Tower: + - Second Floor + - Third Floor + - Fourth Floor + - Fifth Floor + - Sixth Floor + - Seventh Floor + Orange Tower First Floor: + entrances: + Hub Room: + door: Shortcut to Hub Room + Outside The Wanderer: + room: Outside The Wanderer + door: Tower Entrance + Orange Tower Second Floor: + room: Orange Tower + door: Second Floor + Directional Gallery: + door: Salt Pepper Door + Roof: True # through the sunwarp + panels: + SECRET: + id: Shuffle Room/Panel_secret_secret + tag: midwhite + DADS + ALE: + id: Tower Room/Panel_dads_ale_dead_1 + colors: orange + check: True + tag: midorange + SALT: + id: Backside Room/Panel_salt_pepper + colors: black + tag: botblack + doors: + Shortcut to Hub Room: + id: Shuffle Room Area Doors/Door_secret_secret + group: Orange Tower First Floor - Shortcuts + panels: + - SECRET + Salt Pepper Door: + id: Count Up Room Area Doors/Door_salt_pepper + location_name: Orange Tower First Floor - Salt Pepper Door + group: Orange Tower First Floor - Shortcuts + panels: + - SALT + - room: Directional Gallery + panel: PEPPER + Orange Tower Second Floor: + entrances: + Orange Tower First Floor: + room: Orange Tower + door: Second Floor + Orange Tower Third Floor: + room: Orange Tower + door: Third Floor + Outside The Undeterred: True + Orange Tower Third Floor: + entrances: + Knight Night Exit: + room: Knight Night (Final) + door: Exit + Orange Tower Second Floor: + room: Orange Tower + door: Third Floor + Orange Tower Fourth Floor: + room: Orange Tower + door: Fourth Floor + Hot Crusts Area: True # sunwarp + Bearer Side Area: # This is complicated because of The Bearer's topology + room: Bearer Side Area + door: Shortcut to Tower + Rhyme Room (Smiley): + door: Rhyme Room Entrance + panels: + RED: + id: Color Arrow Room/Panel_red_afar + tag: midwhite + required_door: + door: Red Barrier + DEER + WREN: + id: Tower Room/Panel_deer_wren_rats_3 + colors: orange + check: True + tag: midorange + doors: + Red Barrier: + id: Color Arrow Room Doors/Door_red_6 + group: Color Hunt Barriers + skip_location: True + panels: + - room: Champion's Rest + panel: RED + Rhyme Room Entrance: + id: Double Room Area Doors/Door_room_entry_stairs2 + skip_location: True + group: Rhyme Room Doors + panels: + - room: The Tenacious + panel: LEVEL (Black) + - room: The Tenacious + panel: RACECAR (Black) + - room: The Tenacious + panel: SOLOS (Black) + Orange Barrier: # see note in Outside The Initiated + id: + - Color Arrow Room Doors/Door_orange_hider_1 + - Color Arrow Room Doors/Door_orange_hider_2 + - Color Arrow Room Doors/Door_orange_hider_3 + location_name: Color Hunt - RED and YELLOW + group: Champion's Rest - Color Barriers + item_name: Champion's Rest - Orange Barrier + panels: + - RED + - room: Directional Gallery + panel: YELLOW + paintings: + - id: arrows_painting_6 + orientation: east + - id: flower_painting_5 + orientation: south + Orange Tower Fourth Floor: + entrances: + Orange Tower Third Floor: + room: Orange Tower + door: Fourth Floor + Orange Tower Fifth Floor: + room: Orange Tower + door: Fifth Floor + Hot Crusts Area: + door: Hot Crusts Door + Crossroads: + - room: Crossroads + door: Tower Entrance + - room: Crossroads + door: Tower Back Entrance + Courtyard: True + Roof: True # through the sunwarp + panels: + RUNT: + id: Shuffle Room/Panel_turn_runt2 + colors: yellow + tag: midyellow + RUNT (2): + id: Shuffle Room/Panel_runt3 + colors: + - yellow + - blue + tag: mid yellow blue + LEARNS + UNSEW: + id: Tower Room/Panel_learns_unsew_unrest_4 + colors: orange + check: True + tag: midorange + HOT CRUSTS: + id: Shuffle Room/Panel_shortcuts + colors: yellow + tag: midyellow + IRK HORN: + id: Shuffle Room/Panel_corner + colors: yellow + check: True + exclude_reduce: True + tag: topyellow + doors: + Hot Crusts Door: + id: Shuffle Room Area Doors/Door_hotcrust_shortcuts + panels: + - HOT CRUSTS + Hot Crusts Area: + entrances: + Orange Tower Fourth Floor: + room: Orange Tower Fourth Floor + door: Hot Crusts Door + Roof: True # through the sunwarp + panels: + EIGHT: + id: Backside Room/Panel_eight_eight_3 + tag: midwhite + required_door: + room: Number Hunt + door: Eights + paintings: + - id: smile_painting_8 + orientation: north + Orange Tower Fifth Floor: + entrances: + Orange Tower Fourth Floor: + room: Orange Tower + door: Fifth Floor + Orange Tower Sixth Floor: + room: Orange Tower + door: Sixth Floor + Cellar: + room: Room Room + door: Shortcut to Fifth Floor + Welcome Back Area: + door: Welcome Back + Art Gallery: + room: Art Gallery + door: Exit + The Bearer: + room: Art Gallery + door: Exit + Outside The Initiated: + room: Art Gallery + door: Exit + panels: + SIZE (Small): + id: Entry Room/Panel_size_small + colors: gray + tag: forbid + SIZE (Big): + id: Entry Room/Panel_size_big + colors: gray + tag: forbid + DRAWL + RUNS: + id: Tower Room/Panel_drawl_runs_enter_5 + colors: orange + check: True + tag: midorange + NINE: + id: Backside Room/Panel_nine_nine_2 + tag: midwhite + required_door: + room: Number Hunt + door: Nines + SUMMER: + id: Entry Room/Panel_summer_summer + tag: midwhite + AUTUMN: + id: Entry Room/Panel_autumn_autumn + tag: midwhite + SPRING: + id: Entry Room/Panel_spring_spring + tag: midwhite + PAINTING (1): + id: Panel Room/Panel_painting_flower + colors: green + tag: forbid + required_room: Cellar + PAINTING (2): + id: Panel Room/Panel_painting_eye + colors: green + tag: forbid + required_room: Cellar + PAINTING (3): + id: Panel Room/Panel_painting_snowman + colors: green + tag: forbid + required_room: Cellar + PAINTING (4): + id: Panel Room/Panel_painting_owl + colors: green + tag: forbid + required_room: Cellar + PAINTING (5): + id: Panel Room/Panel_painting_panda + colors: green + tag: forbid + required_room: Cellar + ROOM: + id: Panel Room/Panel_room_stairs + colors: gray + tag: forbid + required_room: Cellar + doors: + Welcome Back: + id: Entry Room Area Doors/Door_sizes + group: Welcome Back Doors + panels: + - SIZE (Small) + - SIZE (Big) + paintings: + - id: hi_solved_painting3 + orientation: south + - id: hi_solved_painting2 + orientation: south + - id: east_afar + orientation: north + Orange Tower Sixth Floor: + entrances: + Orange Tower Fifth Floor: + room: Orange Tower + door: Sixth Floor + The Scientific: + painting: True + paintings: + - id: arrows_painting_10 + orientation: east + - id: owl_painting_3 + orientation: north + - id: clock_painting + orientation: west + - id: scenery_painting_5d_2 + orientation: south + - id: symmetry_painting_b_7 + orientation: north + - id: panda_painting_2 + orientation: south + - id: crown_painting2 + orientation: north + - id: colors_painting2 + orientation: south + - id: cherry_painting2 + orientation: east + - id: hi_solved_painting + orientation: west + Orange Tower Seventh Floor: + entrances: + Orange Tower Sixth Floor: + room: Orange Tower + door: Seventh Floor + panels: + THE END: + id: EndPanel/Panel_end_end + check: True + tag: forbid + non_counting: True + THE MASTER: + # We will set up special rules for this in code. + id: Countdown Panels/Panel_master_master + check: True + tag: forbid + MASTERY: + # This is the MASTERY on the other side of THE FEARLESS. It can only be + # accessed by jumping from the top of the tower. + id: Master Room/Panel_mastery_mastery8 + tag: midwhite + required_door: + door: Mastery + doors: + Mastery: + id: + - Master Room Doors/Door_tower_down + - Master Room Doors/Door_master_master + - Master Room Doors/Door_master_master_2 + - Master Room Doors/Door_master_master_3 + - Master Room Doors/Door_master_master_4 + - Master Room Doors/Door_master_master_5 + - Master Room Doors/Door_master_master_6 + - Master Room Doors/Door_master_master_10 + - Master Room Doors/Door_master_master_11 + - Master Room Doors/Door_master_master_12 + - Master Room Doors/Door_master_master_13 + - Master Room Doors/Door_master_master_14 + - Master Room Doors/Door_master_master_15 + - Master Room Doors/Door_master_down + - Master Room Doors/Door_master_down2 + skip_location: True + panels: + - THE MASTER + Mastery Panels: + skip_item: True + location_name: Mastery Panels + panels: + - room: Room Room + panel: MASTERY + - room: The Steady (Topaz) + panel: MASTERY + - room: Orange Tower Basement + panel: MASTERY + - room: Arrow Garden + panel: MASTERY + - room: Hedge Maze + panel: MASTERY (1) + - room: Roof + panel: MASTERY (1) + - room: Roof + panel: MASTERY (2) + - MASTERY + - room: Hedge Maze + panel: MASTERY (2) + - room: Roof + panel: MASTERY (3) + - room: Roof + panel: MASTERY (4) + - room: Roof + panel: MASTERY (5) + - room: Elements Area + panel: MASTERY + - room: Pilgrim Antechamber + panel: MASTERY + - room: Roof + panel: MASTERY (6) + paintings: + - id: map_painting2 + orientation: north + enter_only: True # otherwise you might just skip the whole game! + req_blocked_when_no_doors: True # owl hallway in vanilla doors + Roof: + entrances: + Orange Tower Seventh Floor: True + Crossroads: + room: Crossroads + door: Roof Access + panels: + MASTERY (1): + id: Master Room/Panel_mastery_mastery6 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + MASTERY (2): + id: Master Room/Panel_mastery_mastery7 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + MASTERY (3): + id: Master Room/Panel_mastery_mastery10 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + MASTERY (4): + id: Master Room/Panel_mastery_mastery11 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + MASTERY (5): + id: Master Room/Panel_mastery_mastery12 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + MASTERY (6): + id: Master Room/Panel_mastery_mastery15 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + STAIRCASE: + id: Open Areas/Panel_staircase + tag: midwhite + Orange Tower Basement: + entrances: + Orange Tower Sixth Floor: + room: Orange Tower Seventh Floor + door: Mastery + panels: + MASTERY: + id: Master Room/Panel_mastery_mastery3 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + THE LIBRARY: + id: EndPanel/Panel_library + check: True + tag: forbid + non_counting: True + paintings: + - id: arrows_painting_11 + orientation: east + req_blocked_when_no_doors: True # owl hallway in vanilla doors + Courtyard: + entrances: + Roof: True + Orange Tower Fourth Floor: True + Arrow Garden: + painting: True + Starting Room: + door: Painting Shortcut + painting: True + Yellow Backside Area: + room: First Second Third Fourth + door: Backside Door + The Colorful (White): True + panels: + I: + id: Strand Room/Panel_i_staring + colors: blue + tag: forbid + GREEN: + id: Color Arrow Room/Panel_green_afar + tag: midwhite + required_door: + door: Green Barrier + PINECONE: + id: Shuffle Room/Panel_pinecone_pine + colors: brown + tag: botbrown + ACORN: + id: Shuffle Room/Panel_acorn_oak + colors: brown + tag: botbrown + doors: + Painting Shortcut: + painting_id: flower_painting_8 + item_name: Starting Room - Flower Painting + skip_location: True + panels: + - room: First Second Third Fourth + panel: FIRST + - room: First Second Third Fourth + panel: SECOND + - room: First Second Third Fourth + panel: THIRD + - room: First Second Third Fourth + panel: FOURTH + Green Barrier: + id: Color Arrow Room Doors/Door_green_5 + group: Color Hunt Barriers + skip_location: True + panels: + - room: Champion's Rest + panel: GREEN + paintings: + - id: flower_painting_7 + orientation: north + Yellow Backside Area: + entrances: + Courtyard: + room: First Second Third Fourth + door: Backside Door + Roof: True + panels: + BACKSIDE: + id: Backside Room/Panel_backside_3 + tag: midwhite + NINE: + id: Backside Room/Panel_nine_nine_8 + tag: midwhite + required_door: + room: Number Hunt + door: Nines + paintings: + - id: blueman_painting + orientation: east + First Second Third Fourth: + # We are separating this door + its panels into its own room because they + # are accessible from two distinct regions (Courtyard and Yellow Backside + # Area). We need to do this because painting shuffle makes it possible to + # have access to Yellow Backside Area without having access to Courtyard, + # and we want it to still be in logic to solve these panels. + entrances: + Courtyard: True + Yellow Backside Area: True + panels: + FIRST: + id: Backside Room/Panel_first_first + tag: midwhite + SECOND: + id: Backside Room/Panel_second_second + tag: midwhite + THIRD: + id: Backside Room/Panel_third_third + tag: midwhite + FOURTH: + id: Backside Room/Panel_fourth_fourth + tag: midwhite + doors: + Backside Door: + id: Count Up Room Area Doors/Door_yellow_backside + group: Backside Doors + location_name: Courtyard - FIRST, SECOND, THIRD, FOURTH + item_name: Courtyard - Backside Door + panels: + - FIRST + - SECOND + - THIRD + - FOURTH + The Colorful (White): + entrances: + Courtyard: True + The Colorful (Black): + door: Progress Door + panels: + BEGIN: + id: Doorways Room/Panel_begin_start + tag: botwhite + doors: + Progress Door: + id: Doorway Room Doors/Door_white + item_name: The Colorful - White Door + group: Colorful Doors + location_name: The Colorful - White + panels: + - BEGIN + The Colorful (Black): + entrances: + The Colorful (White): + room: The Colorful (White) + door: Progress Door + The Colorful (Red): + door: Progress Door + panels: + FOUND: + id: Doorways Room/Panel_found_lost + colors: black + tag: botblack + doors: + Progress Door: + id: Doorway Room Doors/Door_black + item_name: The Colorful - Black Door + location_name: The Colorful - Black + group: Colorful Doors + panels: + - FOUND + The Colorful (Red): + entrances: + The Colorful (Black): + room: The Colorful (Black) + door: Progress Door + The Colorful (Yellow): + door: Progress Door + panels: + LOAF: + id: Doorways Room/Panel_loaf_crust + colors: red + tag: botred + doors: + Progress Door: + id: Doorway Room Doors/Door_red + item_name: The Colorful - Red Door + location_name: The Colorful - Red + group: Colorful Doors + panels: + - LOAF + The Colorful (Yellow): + entrances: + The Colorful (Red): + room: The Colorful (Red) + door: Progress Door + The Colorful (Blue): + door: Progress Door + panels: + CREAM: + id: Doorways Room/Panel_eggs_breakfast + colors: yellow + tag: botyellow + doors: + Progress Door: + id: Doorway Room Doors/Door_yellow + item_name: The Colorful - Yellow Door + location_name: The Colorful - Yellow + group: Colorful Doors + panels: + - CREAM + The Colorful (Blue): + entrances: + The Colorful (Yellow): + room: The Colorful (Yellow) + door: Progress Door + The Colorful (Purple): + door: Progress Door + panels: + SUN: + id: Doorways Room/Panel_sun_sky + colors: blue + tag: botblue + doors: + Progress Door: + id: Doorway Room Doors/Door_blue + item_name: The Colorful - Blue Door + location_name: The Colorful - Blue + group: Colorful Doors + panels: + - SUN + The Colorful (Purple): + entrances: + The Colorful (Blue): + room: The Colorful (Blue) + door: Progress Door + The Colorful (Orange): + door: Progress Door + panels: + SPOON: + id: Doorways Room/Panel_teacher_substitute + colors: purple + tag: botpurple + doors: + Progress Door: + id: Doorway Room Doors/Door_purple + item_name: The Colorful - Purple Door + location_name: The Colorful - Purple + group: Colorful Doors + panels: + - SPOON + The Colorful (Orange): + entrances: + The Colorful (Purple): + room: The Colorful (Purple) + door: Progress Door + The Colorful (Green): + door: Progress Door + panels: + LETTERS: + id: Doorways Room/Panel_walnuts_orange + colors: orange + tag: botorange + doors: + Progress Door: + id: Doorway Room Doors/Door_orange + item_name: The Colorful - Orange Door + location_name: The Colorful - Orange + group: Colorful Doors + panels: + - LETTERS + The Colorful (Green): + entrances: + The Colorful (Orange): + room: The Colorful (Orange) + door: Progress Door + The Colorful (Brown): + door: Progress Door + panels: + WALLS: + id: Doorways Room/Panel_path_i + colors: green + tag: forbid + doors: + Progress Door: + id: Doorway Room Doors/Door_green + item_name: The Colorful - Green Door + location_name: The Colorful - Green + group: Colorful Doors + panels: + - WALLS + The Colorful (Brown): + entrances: + The Colorful (Green): + room: The Colorful (Green) + door: Progress Door + The Colorful (Gray): + door: Progress Door + panels: + IRON: + id: Doorways Room/Panel_iron_rust + colors: brown + tag: botbrown + doors: + Progress Door: + id: Doorway Room Doors/Door_brown + item_name: The Colorful - Brown Door + location_name: The Colorful - Brown + group: Colorful Doors + panels: + - IRON + The Colorful (Gray): + entrances: + The Colorful (Brown): + room: The Colorful (Brown) + door: Progress Door + The Colorful: + door: Progress Door + panels: + OBSTACLE: + id: Doorways Room/Panel_obstacle_door + colors: gray + tag: forbid + doors: + Progress Door: + id: + - Doorway Room Doors/Door_gray + - Doorway Room Doors/Door_gray2 # See comment below + item_name: The Colorful - Gray Door + location_name: The Colorful - Gray + group: Colorful Doors + panels: + - OBSTACLE + The Colorful: + # The set of required_doors in the achievement panel should prevent + # generation from asking you to solve The Colorful before opening all of the + # doors. Access from the roof is included so that the painting here could be + # an entrance. The client will have to be hardcoded to not open the door to + # the achievement until all of the doors are open, whether by solving the + # panels or through receiving items. + entrances: + The Colorful (Gray): + room: The Colorful (Gray) + door: Progress Door + Roof: True + panels: + Achievement: + id: Countdown Panels/Panel_colorful_colorful + check: True + tag: forbid + required_door: + - room: The Colorful (White) + door: Progress Door + - room: The Colorful (Black) + door: Progress Door + - room: The Colorful (Red) + door: Progress Door + - room: The Colorful (Yellow) + door: Progress Door + - room: The Colorful (Blue) + door: Progress Door + - room: The Colorful (Purple) + door: Progress Door + - room: The Colorful (Orange) + door: Progress Door + - room: The Colorful (Green) + door: Progress Door + - room: The Colorful (Brown) + door: Progress Door + - room: The Colorful (Gray) + door: Progress Door + achievement: The Colorful + paintings: + - id: arrows_painting_12 + orientation: north + Welcome Back Area: + entrances: + Starting Room: + door: Shortcut to Starting Room + Hub Room: True + Outside The Wondrous: True + Outside The Undeterred: True + Outside The Agreeable: True + Outside The Wanderer: True + Orange Tower Fifth Floor: + room: Orange Tower Fifth Floor + door: Welcome Back + Challenge Room: + room: Challenge Room + door: Welcome Door + panels: + WELCOME BACK: + id: Entry Room/Panel_return_return + tag: midwhite + SECRET: + id: Entry Room/Panel_secret_secret + tag: midwhite + CLOCKWISE: + id: Shuffle Room/Panel_clockwise_counterclockwise + colors: black + check: True + exclude_reduce: True + tag: botblack + doors: + Shortcut to Starting Room: + id: Entry Room Area Doors/Door_return_return + group: Welcome Back Doors + include_reduce: True + panels: + - WELCOME BACK + Owl Hallway: + entrances: + Hidden Room: + painting: True + Hedge Maze: + door: Shortcut to Hedge Maze + Orange Tower Sixth Floor: + painting: True + panels: + STRAYS: + id: Maze Room/Panel_strays_maze + colors: purple + tag: toppurp + READS + RUST: + id: Tower Room/Panel_reads_rust_lawns_6 + colors: orange + check: True + tag: midorange + doors: + Shortcut to Hedge Maze: + id: Maze Area Doors/Door_strays_maze + group: Hedge Maze Doors + panels: + - STRAYS + paintings: + - id: arrows_painting_8 + orientation: south + - id: maze_painting_2 + orientation: north + - id: owl_painting_2 + orientation: south + required_when_no_doors: True + - id: clock_painting_4 + orientation: north + Outside The Initiated: + entrances: + Hub Room: + door: Shortcut to Hub Room + Knight Night Exit: + room: Knight Night (Final) + door: Exit + Orange Tower Third Floor: True # sunwarp + Orange Tower Fifth Floor: + room: Art Gallery + door: Exit + Eight Alcove: + door: Eight Door + panels: + SEVEN (1): + id: Backside Room/Panel_seven_seven_5 + tag: midwhite + required_door: + room: Number Hunt + door: Sevens + SEVEN (2): + id: Backside Room/Panel_seven_seven_6 + tag: midwhite + required_door: + room: Number Hunt + door: Sevens + EIGHT: + id: Backside Room/Panel_eight_eight_7 + tag: midwhite + required_door: + room: Number Hunt + door: Eights + NINE: + id: Backside Room/Panel_nine_nine_4 + tag: midwhite + required_door: + room: Number Hunt + door: Nines + BLUE: + id: Color Arrow Room/Panel_blue_afar + tag: midwhite + required_door: + door: Blue Barrier + ORANGE: + id: Color Arrow Room/Panel_orange_afar + tag: midwhite + required_door: + door: Orange Barrier + UNCOVER: + id: Appendix Room/Panel_discover_recover + colors: purple + tag: midpurp + OXEN: + id: Rhyme Room/Panel_locked_knocked + colors: purple + tag: midpurp + BACKSIDE: + id: Backside Room/Panel_backside_1 + tag: midwhite + The Optimistic: + id: Countdown Panels/Panel_optimistic_optimistic + check: True + tag: forbid + required_door: + door: Backsides + achievement: The Optimistic + PAST: + id: Shuffle Room/Panel_past_present + colors: brown + tag: botbrown + FUTURE: + id: Shuffle Room/Panel_future_present + colors: + - brown + - black + tag: bot brown black + FUTURE (2): + id: Shuffle Room/Panel_future_past + colors: black + tag: botblack + PAST (2): + id: Shuffle Room/Panel_past_future + colors: black + tag: botblack + PRESENT: + id: Shuffle Room/Panel_past_past + colors: + - brown + - black + tag: bot brown black + SMILE: + id: Open Areas/Panel_smile_smile + tag: midwhite + ANGERED: + id: Open Areas/Panel_angered_enraged + colors: + - yellow + tag: syn anagram + copy_to_sign: sign18 + VOTE: + id: Open Areas/Panel_vote_veto + colors: + - yellow + - black + tag: ant anagram + copy_to_sign: sign17 + doors: + Shortcut to Hub Room: + id: Appendix Room Area Doors/Door_recover_discover + panels: + - UNCOVER + Blue Barrier: + id: Color Arrow Room Doors/Door_blue_3 + group: Color Hunt Barriers + skip_location: True + panels: + - room: Champion's Rest + panel: BLUE + Orange Barrier: + id: Color Arrow Room Doors/Door_orange_3 + group: Color Hunt Barriers + skip_location: True + panels: + - room: Champion's Rest + panel: ORANGE + Initiated Entrance: + id: Red Blue Purple Room Area Doors/Door_locked_knocked + item_name: The Initiated - Entrance + panels: + - OXEN + # These would be more appropriate in Champion's Rest, but as currently + # implemented, locations need to include at least one panel from the + # containing region. + Green Barrier: + id: Color Arrow Room Doors/Door_green_hider_1 + location_name: Color Hunt - BLUE and YELLOW + item_name: Champion's Rest - Green Barrier + group: Champion's Rest - Color Barriers + panels: + - BLUE + - room: Directional Gallery + panel: YELLOW + Purple Barrier: + id: + - Color Arrow Room Doors/Door_purple_hider_1 + - Color Arrow Room Doors/Door_purple_hider_2 + - Color Arrow Room Doors/Door_purple_hider_3 + location_name: Color Hunt - RED and BLUE + item_name: Champion's Rest - Purple Barrier + group: Champion's Rest - Color Barriers + panels: + - BLUE + - room: Orange Tower Third Floor + panel: RED + Entrance: + id: + - Color Arrow Room Doors/Door_all_hider_1 + - Color Arrow Room Doors/Door_all_hider_2 + - Color Arrow Room Doors/Door_all_hider_3 + location_name: Color Hunt - GREEN, ORANGE and PURPLE + item_name: Champion's Rest - Entrance + panels: + - ORANGE + - room: Courtyard + panel: GREEN + - room: Outside The Agreeable + panel: PURPLE + Backsides: + event: True + panels: + - room: The Observant + panel: BACKSIDE + - room: Yellow Backside Area + panel: BACKSIDE + - room: Directional Gallery + panel: BACKSIDE + - room: The Bearer + panel: BACKSIDE + Eight Door: + id: Red Blue Purple Room Area Doors/Door_a_strands2 + skip_location: True + panels: + - room: The Incomparable + panel: I (Seven) + - room: Courtyard + panel: I + - room: Elements Area + panel: A + paintings: + - id: clock_painting_5 + orientation: east + - id: smile_painting_1 + orientation: north + The Initiated: + entrances: + Outside The Initiated: + room: Outside The Initiated + door: Initiated Entrance + panels: + Achievement: + id: Countdown Panels/Panel_illuminated_initiated + colors: purple + tag: forbid + check: True + achievement: The Initiated + DAUGHTER: + id: Rhyme Room/Panel_daughter_laughter + colors: purple + tag: midpurp + START: + id: Rhyme Room/Panel_move_love + colors: purple + tag: double midpurp + subtag: left + link: change STARS + STARE: + id: Rhyme Room/Panel_stove_love + colors: purple + tag: double midpurp + subtag: right + link: change STARS + HYPE: + id: Rhyme Room/Panel_scope_type + colors: purple + tag: midpurp and rhyme + copy_to_sign: sign16 + ABYSS: + id: Rhyme Room/Panel_abyss_this + colors: purple + tag: toppurp + SWEAT: + id: Rhyme Room/Panel_sweat_great + colors: purple + tag: double midpurp + subtag: left + link: change GREAT + BEAT: + id: Rhyme Room/Panel_beat_great + colors: purple + tag: double midpurp + subtag: right + link: change GREAT + ALUMNI: + id: Rhyme Room/Panel_alumni_hi + colors: purple + tag: midpurp and rhyme + copy_to_sign: sign14 + PATS: + id: Rhyme Room/Panel_wrath_path + colors: purple + tag: midpurp and rhyme + copy_to_sign: sign15 + KNIGHT: + id: Rhyme Room/Panel_knight_write + colors: purple + tag: double toppurp + subtag: left + link: change WRITE + BYTE: + id: Rhyme Room/Panel_byte_write + colors: purple + tag: double toppurp + subtag: right + link: change WRITE + MAIM: + id: Rhyme Room/Panel_maim_same + colors: purple + tag: toppurp + MORGUE: + id: Rhyme Room/Panel_chair_bear + colors: purple + tag: purple rhyme change stack + subtag: top + link: prcs CYBORG + CHAIR: + id: Rhyme Room/Panel_bare_bear + colors: purple + tag: toppurp + HUMAN: + id: Rhyme Room/Panel_cost_most + colors: purple + tag: purple rhyme change stack + subtag: bot + link: prcs CYBORG + BED: + id: Rhyme Room/Panel_bed_dead + colors: purple + tag: toppurp + The Traveled: + entrances: + Hub Room: + room: Hub Room + door: Traveled Entrance + Color Hallways: + door: Color Hallways Entrance + panels: + Achievement: + id: Countdown Panels/Panel_traveled_traveled + required_room: Hub Room + tag: forbid + check: True + achievement: The Traveled + CLOSE: + id: Synonym Room/Panel_close_near + tag: botwhite + COMPOSE: + id: Synonym Room/Panel_compose_write + tag: double botwhite + subtag: left + link: syn WRITE + RECORD: + id: Synonym Room/Panel_record_write + tag: double botwhite + subtag: right + link: syn WRITE + CATEGORY: + id: Synonym Room/Panel_category_type + tag: botwhite + HELLO: + id: Synonym Room/Panel_hello_hi + tag: botwhite + DUPLICATE: + id: Synonym Room/Panel_duplicate_same + tag: double botwhite + subtag: left + link: syn SAME + IDENTICAL: + id: Synonym Room/Panel_identical_same + tag: double botwhite + subtag: right + link: syn SAME + DISTANT: + id: Synonym Room/Panel_distant_far + tag: botwhite + HAY: + id: Synonym Room/Panel_hay_straw + tag: botwhite + GIGGLE: + id: Synonym Room/Panel_giggle_laugh + tag: double botwhite + subtag: left + link: syn LAUGH + CHUCKLE: + id: Synonym Room/Panel_chuckle_laugh + tag: double botwhite + subtag: right + link: syn LAUGH + SNITCH: + id: Synonym Room/Panel_snitch_rat + tag: botwhite + CONCEALED: + id: Synonym Room/Panel_concealed_hidden + tag: botwhite + PLUNGE: + id: Synonym Room/Panel_plunge_fall + tag: double botwhite + subtag: left + link: syn FALL + AUTUMN: + id: Synonym Room/Panel_autumn_fall + tag: double botwhite + subtag: right + link: syn FALL + ROAD: + id: Synonym Room/Panel_growths_warts + tag: botwhite + FOUR: + id: Backside Room/Panel_four_four_4 + tag: midwhite + required_door: + room: Outside The Undeterred + door: Fours + doors: + Color Hallways Entrance: + id: Appendix Room Area Doors/Door_hello_hi + group: Entrance to The Traveled + panels: + - HELLO + Color Hallways: + entrances: + The Traveled: + room: The Traveled + door: Color Hallways Entrance + Outside The Bold: True + Outside The Undeterred: True + Crossroads: True + Hedge Maze: True + Outside The Initiated: True # backside + Directional Gallery: True # backside + Yellow Backside Area: True + The Bearer: + room: The Bearer + door: Backside Door + The Observant: + room: The Observant + door: Backside Door + Outside The Bold: + entrances: + Color Hallways: True + Champion's Rest: + room: Champion's Rest + door: Shortcut to The Steady + The Bearer: + room: The Bearer + door: Shortcut to The Bold + Directional Gallery: + # There is a painting warp here from the Directional Gallery, but it + # only appears when the sixes are revealed. It could be its own item if + # we wanted. + room: Number Hunt + door: Sixes + painting: True + Starting Room: + door: Painting Shortcut + painting: True + Room Room: True # trapdoor + panels: + UNOPEN: + id: Truncate Room/Panel_unopened_open + colors: red + tag: midred + BEGIN: + id: Rock Room/Panel_begin_begin + tag: midwhite + SIX: + id: Backside Room/Panel_six_six_4 + tag: midwhite + required_door: + room: Number Hunt + door: Sixes + NINE: + id: Backside Room/Panel_nine_nine_5 + tag: midwhite + required_door: + room: Number Hunt + door: Nines + LEFT: + id: Shuffle Room/Panel_left_left_2 + tag: midwhite + RIGHT: + id: Shuffle Room/Panel_right_right_2 + tag: midwhite + RISE (Horizon): + id: Open Areas/Panel_rise_horizon + colors: blue + tag: double topblue + subtag: left + link: expand HORIZON + RISE (Sunrise): + id: Open Areas/Panel_rise_sunrise + colors: blue + tag: double topblue + subtag: left + link: expand SUNRISE + ZEN: + id: Open Areas/Panel_son_horizon + colors: blue + tag: double topblue + subtag: right + link: expand HORIZON + SON: + id: Open Areas/Panel_son_sunrise + colors: blue + tag: double topblue + subtag: right + link: expand SUNRISE + STARGAZER: + id: Open Areas/Panel_stargazer_stargazer + tag: midwhite + required_door: + door: Stargazer Door + MOUTH: + id: Cross Room/Panel_mouth_south + colors: purple + tag: midpurp + YEAST: + id: Cross Room/Panel_yeast_east + colors: red + tag: midred + WET: + id: Cross Room/Panel_wet_west + colors: blue + tag: midblue + doors: + Bold Entrance: + id: Red Blue Purple Room Area Doors/Door_unopened_open + item_name: The Bold - Entrance + panels: + - UNOPEN + Painting Shortcut: + painting_id: pencil_painting6 + skip_location: True + item_name: Starting Room - Pencil Painting + panels: + - UNOPEN + Steady Entrance: + id: Rock Room Doors/Door_2 + item_name: The Steady - Entrance + panels: + - BEGIN + Lilac Entrance: + event: True + panels: + - room: The Steady (Rose) + panel: SOAR + Stargazer Door: + event: True + panels: + - RISE (Horizon) + - RISE (Sunrise) + - ZEN + - SON + paintings: + - id: pencil_painting2 + orientation: west + - id: north_missing2 + orientation: north + The Bold: + entrances: + Outside The Bold: + room: Outside The Bold + door: Bold Entrance + panels: + Achievement: + id: Countdown Panels/Panel_emboldened_bold + colors: red + tag: forbid + check: True + achievement: The Bold + FOOT: + id: Truncate Room/Panel_foot_toe + colors: red + tag: botred + NEEDLE: + id: Truncate Room/Panel_needle_eye + colors: red + tag: double botred + subtag: left + link: mero EYE + FACE: + id: Truncate Room/Panel_face_eye + colors: red + tag: double botred + subtag: right + link: mero EYE + SIGN: + id: Truncate Room/Panel_sign_sigh + colors: red + tag: topred + HEARTBREAK: + id: Truncate Room/Panel_heartbreak_brake + colors: red + tag: topred + UNDEAD: + id: Truncate Room/Panel_undead_dead + colors: red + tag: double midred + subtag: left + link: trunc DEAD + DEADLINE: + id: Truncate Room/Panel_deadline_dead + colors: red + tag: double midred + subtag: right + link: trunc DEAD + SUSHI: + id: Truncate Room/Panel_sushi_hi + colors: red + tag: midred + THISTLE: + id: Truncate Room/Panel_thistle_this + colors: red + tag: midred + LANDMASS: + id: Truncate Room/Panel_landmass_mass + colors: red + tag: double midred + subtag: left + link: trunc MASS + MASSACRED: + id: Truncate Room/Panel_massacred_mass + colors: red + tag: double midred + subtag: right + link: trunc MASS + AIRPLANE: + id: Truncate Room/Panel_airplane_plain + colors: red + tag: topred + NIGHTMARE: + id: Truncate Room/Panel_nightmare_knight + colors: red + tag: topred + MOUTH: + id: Truncate Room/Panel_mouth_teeth + colors: red + tag: double botred + subtag: left + link: mero TEETH + SAW: + id: Truncate Room/Panel_saw_teeth + colors: red + tag: double botred + subtag: right + link: mero TEETH + HAND: + id: Truncate Room/Panel_hand_finger + colors: red + tag: botred + Outside The Undeterred: + entrances: + Color Hallways: True + Orange Tower First Floor: True # sunwarp + Orange Tower Second Floor: True + The Artistic (Smiley): True + The Artistic (Panda): True + The Artistic (Apple): True + The Artistic (Lattice): True + Yellow Backside Area: + painting: True + Number Hunt: + door: Number Hunt + Directional Gallery: + room: Directional Gallery + door: Shortcut to The Undeterred + Starting Room: + door: Painting Shortcut + painting: True + panels: + HOLLOW: + id: Hallway Room/Panel_hollow_hollow + tag: midwhite + ART + ART: + id: Tower Room/Panel_art_art_eat_2 + colors: orange + check: True + tag: midorange + PEN: + id: Blue Room/Panel_pen_open + colors: blue + tag: midblue + HUSTLING: + id: Open Areas/Panel_hustling_sunlight + colors: yellow + tag: midyellow + SUNLIGHT: + id: Open Areas/Panel_sunlight_light + colors: red + tag: midred + required_panel: + panel: HUSTLING + LIGHT: + id: Open Areas/Panel_light_bright + colors: purple + tag: midpurp + required_panel: + panel: SUNLIGHT + BRIGHT: + id: Open Areas/Panel_bright_sunny + tag: botwhite + required_panel: + panel: LIGHT + SUNNY: + id: Open Areas/Panel_sunny_rainy + colors: black + tag: botblack + required_panel: + panel: BRIGHT + RAINY: + id: Open Areas/Panel_rainy_rainbow + colors: brown + tag: botbrown + required_panel: + panel: SUNNY + check: True + ZERO: + id: Backside Room/Panel_zero_zero + tag: midwhite + required_door: + room: Number Hunt + door: Zero Door + ONE: + id: Backside Room/Panel_one_one + tag: midwhite + TWO (1): + id: Backside Room/Panel_two_two + tag: midwhite + required_door: + door: Twos + TWO (2): + id: Backside Room/Panel_two_two_2 + tag: midwhite + required_door: + door: Twos + THREE (1): + id: Backside Room/Panel_three_three + tag: midwhite + required_door: + door: Threes + THREE (2): + id: Backside Room/Panel_three_three_2 + tag: midwhite + required_door: + door: Threes + THREE (3): + id: Backside Room/Panel_three_three_3 + tag: midwhite + required_door: + door: Threes + FOUR: + id: Backside Room/Panel_four_four + tag: midwhite + required_door: + door: Fours + doors: + Undeterred Entrance: + id: Red Blue Purple Room Area Doors/Door_pen_open + item_name: The Undeterred - Entrance + panels: + - PEN + Painting Shortcut: + painting_id: + - blueman_painting_3 + - arrows_painting3 + skip_location: True + item_name: Starting Room - Blue Painting + panels: + - PEN + Green Painting: + painting_id: maze_painting_3 + skip_location: True + panels: + - FOUR + Twos: + id: + - Count Up Room Area Doors/Door_two_hider + - Count Up Room Area Doors/Door_two_hider_2 + include_reduce: True + panels: + - ONE + Threes: + id: + - Count Up Room Area Doors/Door_three_hider + - Count Up Room Area Doors/Door_three_hider_2 + - Count Up Room Area Doors/Door_three_hider_3 + location_name: Twos + include_reduce: True + panels: + - TWO (1) + - TWO (2) + Number Hunt: + id: Count Up Room Area Doors/Door_three_unlocked + location_name: Threes + include_reduce: True + panels: + - THREE (1) + - THREE (2) + - THREE (3) + Fours: + id: + - Count Up Room Area Doors/Door_four_hider + - Count Up Room Area Doors/Door_four_hider_2 + - Count Up Room Area Doors/Door_four_hider_3 + - Count Up Room Area Doors/Door_four_hider_4 + skip_location: True + panels: + - THREE (1) + - THREE (2) + - THREE (3) + Fives: + id: + - Count Up Room Area Doors/Door_five_hider + - Count Up Room Area Doors/Door_five_hider_4 + - Count Up Room Area Doors/Door_five_hider_5 + location_name: Fours + item_name: Number Hunt - Fives + include_reduce: True + panels: + - FOUR + - room: Hub Room + panel: FOUR + - room: Dead End Area + panel: FOUR + - room: The Traveled + panel: FOUR + Challenge Entrance: + id: Count Up Room Area Doors/Door_zero_unlocked + item_name: Number Hunt - Challenge Entrance + panels: + - ZERO + paintings: + - id: maze_painting_3 + enter_only: True + orientation: north + move: True + required_door: + door: Green Painting + - id: blueman_painting_2 + orientation: east + The Undeterred: + entrances: + Outside The Undeterred: + room: Outside The Undeterred + door: Undeterred Entrance + panels: + Achievement: + id: Countdown Panels/Panel_deterred_undeterred + colors: blue + tag: forbid + check: True + achievement: The Undeterred + BONE: + id: Blue Room/Panel_bone_skeleton + colors: blue + tag: botblue + EYE: + id: Blue Room/Panel_mouth_face + colors: blue + tag: double botblue + subtag: left + link: holo FACE + MOUTH: + id: Blue Room/Panel_eye_face + colors: blue + tag: double botblue + subtag: right + link: holo FACE + IRIS: + id: Blue Room/Panel_toucan_bird + colors: blue + tag: botblue + EYE (2): + id: Blue Room/Panel_two_toucan + colors: blue + tag: topblue + ICE: + id: Blue Room/Panel_ice_eyesight + colors: blue + tag: double topblue + subtag: left + link: hex EYESIGHT + HEIGHT: + id: Blue Room/Panel_height_eyesight + colors: blue + tag: double topblue + subtag: right + link: hex EYESIGHT + EYE (3): + id: Blue Room/Panel_eye_hi + colors: blue + tag: topblue + NOT: + id: Blue Room/Panel_not_notice + colors: blue + tag: midblue + JUST: + id: Blue Room/Panel_just_readjust + colors: blue + tag: double midblue + subtag: left + link: exp READJUST + READ: + id: Blue Room/Panel_read_readjust + colors: blue + tag: double midblue + subtag: right + link: exp READJUST + FATHER: + id: Blue Room/Panel_ate_primate + colors: blue + tag: midblue + FEATHER: + id: Blue Room/Panel_primate_mammal + colors: blue + tag: botblue + CONTINENT: + id: Blue Room/Panel_continent_planet + colors: blue + tag: double botblue + subtag: left + link: holo PLANET + OCEAN: + id: Blue Room/Panel_ocean_planet + colors: blue + tag: double botblue + subtag: right + link: holo PLANET + WALL: + id: Blue Room/Panel_wall_room + colors: blue + tag: botblue + Number Hunt: + # This works a little differently than in the base game. The door to the + # initial number in each set opens at the same time as the rest of the doors + # in that set. + entrances: + Outside The Undeterred: + room: Outside The Undeterred + door: Number Hunt + Directional Gallery: + door: Door to Directional Gallery + Challenge Room: + room: Outside The Undeterred + door: Challenge Entrance + panels: + FIVE: + id: Backside Room/Panel_five_five + tag: midwhite + required_door: + room: Outside The Undeterred + door: Fives + SIX: + id: Backside Room/Panel_six_six + tag: midwhite + required_door: + door: Sixes + SEVEN: + id: Backside Room/Panel_seven_seven + tag: midwhite + required_door: + door: Sevens + EIGHT: + id: Backside Room/Panel_eight_eight + tag: midwhite + required_door: + door: Eights + NINE: + id: Backside Room/Panel_nine_nine + tag: midwhite + required_door: + door: Nines + doors: + Door to Directional Gallery: + id: Count Up Room Area Doors/Door_five_unlocked + group: Directional Gallery Doors + skip_location: True + panels: + - FIVE + Sixes: + id: + - Count Up Room Area Doors/Door_six_hider + - Count Up Room Area Doors/Door_six_hider_2 + - Count Up Room Area Doors/Door_six_hider_3 + - Count Up Room Area Doors/Door_six_hider_4 + - Count Up Room Area Doors/Door_six_hider_5 + - Count Up Room Area Doors/Door_six_hider_6 + painting_id: pencil_painting3 # See note in Outside The Bold + location_name: Fives + include_reduce: True + panels: + - FIVE + - room: Outside The Agreeable + panel: FIVE (1) + - room: Outside The Agreeable + panel: FIVE (2) + - room: Directional Gallery + panel: FIVE (1) + - room: Directional Gallery + panel: FIVE (2) + Sevens: + id: + - Count Up Room Area Doors/Door_seven_hider + - Count Up Room Area Doors/Door_seven_unlocked + - Count Up Room Area Doors/Door_seven_hider_2 + - Count Up Room Area Doors/Door_seven_hider_3 + - Count Up Room Area Doors/Door_seven_hider_4 + - Count Up Room Area Doors/Door_seven_hider_5 + - Count Up Room Area Doors/Door_seven_hider_6 + - Count Up Room Area Doors/Door_seven_hider_7 + location_name: Sixes + include_reduce: True + panels: + - SIX + - room: Outside The Bold + panel: SIX + - room: Directional Gallery + panel: SIX (1) + - room: Directional Gallery + panel: SIX (2) + - room: The Bearer (East) + panel: SIX + - room: The Bearer (South) + panel: SIX + Eights: + id: + - Count Up Room Area Doors/Door_eight_hider + - Count Up Room Area Doors/Door_eight_unlocked + - Count Up Room Area Doors/Door_eight_hider_2 + - Count Up Room Area Doors/Door_eight_hider_3 + - Count Up Room Area Doors/Door_eight_hider_4 + - Count Up Room Area Doors/Door_eight_hider_5 + - Count Up Room Area Doors/Door_eight_hider_6 + - Count Up Room Area Doors/Door_eight_hider_7 + - Count Up Room Area Doors/Door_eight_hider_8 + location_name: Sevens + include_reduce: True + panels: + - SEVEN + - room: Directional Gallery + panel: SEVEN + - room: Knight Night Exit + panel: SEVEN (1) + - room: Knight Night Exit + panel: SEVEN (2) + - room: Knight Night Exit + panel: SEVEN (3) + - room: Outside The Initiated + panel: SEVEN (1) + - room: Outside The Initiated + panel: SEVEN (2) + Nines: + id: + - Count Up Room Area Doors/Door_nine_hider + - Count Up Room Area Doors/Door_nine_hider_2 + - Count Up Room Area Doors/Door_nine_hider_3 + - Count Up Room Area Doors/Door_nine_hider_4 + - Count Up Room Area Doors/Door_nine_hider_5 + - Count Up Room Area Doors/Door_nine_hider_6 + - Count Up Room Area Doors/Door_nine_hider_7 + - Count Up Room Area Doors/Door_nine_hider_8 + - Count Up Room Area Doors/Door_nine_hider_9 + location_name: Eights + include_reduce: True + panels: + - EIGHT + - room: Directional Gallery + panel: EIGHT + - room: The Eyes They See + panel: EIGHT + - room: Dead End Area + panel: EIGHT + - room: Crossroads + panel: EIGHT + - room: Hot Crusts Area + panel: EIGHT + - room: Art Gallery + panel: EIGHT + - room: Outside The Initiated + panel: EIGHT + Zero Door: + # The black wall isn't a door, so we can't ever hide it. + id: Count Up Room Area Doors/Door_zero_hider_2 + location_name: Nines + item_name: Outside The Undeterred - Zero Door + include_reduce: True + panels: + - NINE + - room: Directional Gallery + panel: NINE + - room: Amen Name Area + panel: NINE + - room: Yellow Backside Area + panel: NINE + - room: Outside The Initiated + panel: NINE + - room: Outside The Bold + panel: NINE + - room: Rhyme Room (Cross) + panel: NINE + - room: Orange Tower Fifth Floor + panel: NINE + - room: Elements Area + panel: NINE + paintings: + - id: smile_painting_5 + enter_only: True + orientation: east + required_door: + door: Eights + Directional Gallery: + entrances: + Outside The Agreeable: True # sunwarp + Orange Tower First Floor: + room: Orange Tower First Floor + door: Salt Pepper Door + Outside The Undeterred: + door: Shortcut to The Undeterred + Number Hunt: + room: Number Hunt + door: Door to Directional Gallery + panels: + PEPPER: + id: Backside Room/Panel_pepper_salt + colors: black + tag: botblack + TURN: + id: Backside Room/Panel_turn_return + colors: blue + tag: midblue + LEARN: + id: Backside Room/Panel_learn_return + colors: purple + tag: midpurp + FIVE (1): + id: Backside Room/Panel_five_five_3 + tag: midwhite + required_panel: + panel: LIGHT + FIVE (2): + id: Backside Room/Panel_five_five_2 + tag: midwhite + required_panel: + panel: WARD + SIX (1): + id: Backside Room/Panel_six_six_3 + tag: midwhite + required_door: + room: Number Hunt + door: Sixes + SIX (2): + id: Backside Room/Panel_six_six_2 + tag: midwhite + required_door: + room: Number Hunt + door: Sixes + SEVEN: + id: Backside Room/Panel_seven_seven_2 + tag: midwhite + required_door: + room: Number Hunt + door: Sevens + EIGHT: + id: Backside Room/Panel_eight_eight_2 + tag: midwhite + required_door: + room: Number Hunt + door: Eights + NINE: + id: Backside Room/Panel_nine_nine_6 + tag: midwhite + required_door: + room: Number Hunt + door: Nines + BACKSIDE: + id: Backside Room/Panel_backside_4 + tag: midwhite + "834283054": + id: Tower Room/Panel_834283054_undaunted + colors: orange + check: True + exclude_reduce: True + tag: midorange + required_door: + room: Number Hunt + door: Sixes + PARANOID: + id: Backside Room/Panel_paranoid_paranoid + tag: midwhite + check: True + exclude_reduce: True + required_door: + room: Number Hunt + door: Sixes + YELLOW: + id: Color Arrow Room/Panel_yellow_afar + tag: midwhite + required_door: + door: Yellow Barrier + WADED + WEE: + id: Tower Room/Panel_waded_wee_warts_7 + colors: orange + check: True + exclude_reduce: True + tag: midorange + THE EYES: + id: Shuffle Room/Panel_theeyes_theeyes + tag: midwhite + LEFT: + id: Shuffle Room/Panel_left_left + tag: midwhite + RIGHT: + id: Shuffle Room/Panel_right_right + tag: midwhite + MIDDLE: + id: Shuffle Room/Panel_middle_middle + tag: midwhite + WARD: + id: Backside Room/Panel_ward_forward + colors: blue + tag: midblue + HIND: + id: Backside Room/Panel_hind_behind + colors: blue + tag: midblue + RIG: + id: Backside Room/Panel_rig_right + colors: blue + tag: midblue + WINDWARD: + id: Backside Room/Panel_windward_forward + colors: purple + tag: midpurp + LIGHT: + id: Backside Room/Panel_light_right + colors: purple + tag: midpurp + REWIND: + id: Backside Room/Panel_rewind_behind + colors: purple + tag: midpurp + doors: + Shortcut to The Undeterred: + id: Count Up Room Area Doors/Door_return_double + group: Directional Gallery Doors + panels: + - TURN + - LEARN + Yellow Barrier: + id: Color Arrow Room Doors/Door_yellow_4 + group: Color Hunt Barriers + skip_location: True + panels: + - room: Champion's Rest + panel: YELLOW + paintings: + - id: smile_painting_7 + orientation: south + - id: flower_painting_4 + orientation: south + - id: pencil_painting3 + enter_only: True + orientation: east + move: True + required_door: + room: Number Hunt + door: Sixes + - id: boxes_painting + orientation: south + - id: cherry_painting + orientation: east + Champion's Rest: + entrances: + Outside The Bold: + door: Shortcut to The Steady + Orange Tower Fourth Floor: True # sunwarp + Roof: True # through ceiling of sunwarp + panels: + EXIT: + id: Rock Room/Panel_red_red + tag: midwhite + HUES: + id: Color Arrow Room/Panel_hues_colors + tag: botwhite + RED: + id: Color Arrow Room/Panel_red_near + check: True + tag: midwhite + BLUE: + id: Color Arrow Room/Panel_blue_near + check: True + tag: midwhite + YELLOW: + id: Color Arrow Room/Panel_yellow_near + check: True + tag: midwhite + GREEN: + id: Color Arrow Room/Panel_green_near + check: True + tag: midwhite + required_door: + room: Outside The Initiated + door: Green Barrier + PURPLE: + id: Color Arrow Room/Panel_purple_near + check: True + tag: midwhite + required_door: + room: Outside The Initiated + door: Purple Barrier + ORANGE: + id: Color Arrow Room/Panel_orange_near + check: True + tag: midwhite + required_door: + room: Orange Tower Third Floor + door: Orange Barrier + YOU: + id: Color Arrow Room/Panel_you + required_door: + room: Outside The Initiated + door: Entrance + check: True + colors: gray + tag: forbid + ME: + id: Color Arrow Room/Panel_me + colors: gray + tag: forbid + required_door: + room: Outside The Initiated + door: Entrance + SECRET BLUE: + # Pretend this and the other two are white, because they are snipes. + # TODO: Extract them and randomize them? + id: Color Arrow Room/Panel_secret_blue + tag: forbid + required_door: + room: Outside The Initiated + door: Entrance + SECRET YELLOW: + id: Color Arrow Room/Panel_secret_yellow + tag: forbid + required_door: + room: Outside The Initiated + door: Entrance + SECRET RED: + id: Color Arrow Room/Panel_secret_red + tag: forbid + required_door: + room: Outside The Initiated + door: Entrance + doors: + Shortcut to The Steady: + id: Rock Room Doors/Door_hint + panels: + - EXIT + paintings: + - id: arrows_painting_7 + orientation: east + - id: fruitbowl_painting3 + orientation: west + enter_only: True + required_door: + room: Outside The Initiated + door: Entrance + - id: colors_painting + orientation: south + enter_only: True + required_door: + room: Outside The Initiated + door: Entrance + The Bearer: + entrances: + Outside The Bold: + door: Shortcut to The Bold + Orange Tower Fifth Floor: + room: Art Gallery + door: Exit + The Bearer (East): True + The Bearer (North): True + The Bearer (South): True + The Bearer (West): True + Roof: True + panels: + Achievement: + id: Countdown Panels/Panel_bearer_bearer + check: True + tag: forbid + required_panel: + - panel: PART + - panel: HEART + - room: Cross Tower (East) + panel: WINTER + - room: The Bearer (East) + panel: PEACE + - room: Cross Tower (North) + panel: NORTH + - room: The Bearer (North) + panel: SILENT (1) + - room: The Bearer (North) + panel: SILENT (2) + - room: The Bearer (North) + panel: SPACE + - room: The Bearer (North) + panel: WARTS + - room: Cross Tower (South) + panel: FIRE + - room: The Bearer (South) + panel: TENT + - room: The Bearer (South) + panel: BOWL + - room: Cross Tower (West) + panel: DIAMONDS + - room: The Bearer (West) + panel: SNOW + - room: The Bearer (West) + panel: SMILE + - room: Bearer Side Area + panel: SHORTCUT + - room: Bearer Side Area + panel: POTS + achievement: The Bearer + MIDDLE: + id: Shuffle Room/Panel_middle_middle_2 + tag: midwhite + FARTHER: + id: Backside Room/Panel_farther_far + colors: red + tag: midred + BACKSIDE: + id: Backside Room/Panel_backside_5 + tag: midwhite + required_door: + door: Backside Door + PART: + id: Cross Room/Panel_part_rap + colors: + - red + - yellow + tag: mid red yellow + required_panel: + room: The Bearer (East) + panel: PEACE + HEART: + id: Cross Room/Panel_heart_tar + colors: + - red + - yellow + tag: mid red yellow + doors: + Shortcut to The Bold: + id: Red Blue Purple Room Area Doors/Door_middle_middle + panels: + - MIDDLE + Backside Door: + id: Red Blue Purple Room Area Doors/Door_locked_knocked2 # yeah... + group: Backside Doors + panels: + - FARTHER + East Entrance: + event: True + panels: + - HEART + The Bearer (East): + entrances: + Cross Tower (East): True + Bearer Side Area: + door: Side Area Access + Roof: True + panels: + SIX: + id: Backside Room/Panel_six_six_5 + tag: midwhite + colors: + - red + - yellow + required_door: + room: Number Hunt + door: Sixes + PEACE: + id: Cross Room/Panel_peace_ape + colors: + - red + - yellow + tag: mid red yellow + doors: + North Entrance: + event: True + panels: + - room: The Bearer + panel: PART + Side Area Access: + event: True + panels: + - room: The Bearer (North) + panel: SPACE + The Bearer (North): + entrances: + Cross Tower (East): True + Roof: True + panels: + SILENT (1): + id: Cross Room/Panel_silent_list + colors: + - red + - yellow + tag: mid red yellow + required_panel: + room: The Bearer (West) + panel: SMILE + SILENT (2): + id: Cross Room/Panel_silent_list_2 + colors: + - red + - yellow + tag: mid yellow red + required_panel: + room: The Bearer (West) + panel: SMILE + SPACE: + id: Cross Room/Panel_space_cape + colors: + - red + - yellow + tag: mid red yellow + WARTS: + id: Cross Room/Panel_warts_star + colors: + - red + - yellow + tag: mid red yellow + required_panel: + room: The Bearer (West) + panel: SNOW + doors: + South Entrance: + event: True + panels: + - room: Bearer Side Area + panel: POTS + The Bearer (South): + entrances: + Cross Tower (North): True + Bearer Side Area: + door: Side Area Shortcut + Roof: True + panels: + SIX: + id: Backside Room/Panel_six_six_6 + tag: midwhite + colors: + - red + - yellow + required_door: + room: Number Hunt + door: Sixes + TENT: + id: Cross Room/Panel_tent_net + colors: + - red + - yellow + tag: mid red yellow + BOWL: + id: Cross Room/Panel_bowl_low + colors: + - red + - yellow + tag: mid red yellow + required_panel: + panel: TENT + doors: + Side Area Shortcut: + event: True + panels: + - room: The Bearer (North) + panel: SILENT (1) + The Bearer (West): + entrances: + Cross Tower (West): True + Bearer Side Area: + door: Side Area Shortcut + Roof: True + panels: + SNOW: + id: Cross Room/Panel_smile_lime + colors: + - red + - yellow + tag: mid yellow red + SMILE: + id: Cross Room/Panel_snow_won + colors: + - red + - yellow + tag: mid red yellow + required_panel: + room: The Bearer (North) + panel: WARTS + doors: + Side Area Shortcut: + event: True + panels: + - room: Cross Tower (East) + panel: WINTER + - room: Cross Tower (North) + panel: NORTH + - room: Cross Tower (South) + panel: FIRE + - room: Cross Tower (West) + panel: DIAMONDS + Bearer Side Area: + entrances: + The Bearer (East): + room: The Bearer (East) + door: Side Area Access + The Bearer (South): + room: The Bearer (South) + door: Side Area Shortcut + The Bearer (West): + room: The Bearer (West) + door: Side Area Shortcut + Orange Tower Third Floor: + door: Shortcut to Tower + Roof: True + panels: + SHORTCUT: + id: Cross Room/Panel_shortcut_shortcut + tag: midwhite + POTS: + id: Cross Room/Panel_pots_top + colors: + - red + - yellow + tag: mid yellow red + doors: + Shortcut to Tower: + id: Cross Room Doors/Door_shortcut + item_name: The Bearer - Shortcut to Tower + location_name: The Bearer - SHORTCUT + panels: + - SHORTCUT + West Entrance: + event: True + panels: + - room: The Bearer (South) + panel: BOWL + Cross Tower (East): + entrances: + The Bearer: + room: The Bearer + door: East Entrance + Roof: True + panels: + WINTER: + id: Cross Room/Panel_winter_winter + colors: blue + tag: forbid + required_panel: + room: The Bearer (North) + panel: SPACE + required_room: Orange Tower Fifth Floor + Cross Tower (North): + entrances: + The Bearer (East): + room: The Bearer (East) + door: North Entrance + Roof: True + panels: + NORTH: + id: Cross Room/Panel_north_north + colors: blue + tag: forbid + required_panel: + room: The Bearer (West) + panel: SMILE + required_room: Outside The Bold + Cross Tower (South): + entrances: # No roof access + The Bearer (North): + room: The Bearer (North) + door: South Entrance + panels: + FIRE: + id: Cross Room/Panel_fire_fire + colors: blue + tag: forbid + required_panel: + room: The Bearer (North) + panel: SILENT (1) + required_room: Elements Area + Cross Tower (West): + entrances: + Bearer Side Area: + room: Bearer Side Area + door: West Entrance + Roof: True + panels: + DIAMONDS: + id: Cross Room/Panel_diamonds_diamonds + colors: blue + tag: forbid + required_panel: + room: The Bearer (North) + panel: WARTS + required_room: Suits Area + The Steady (Rose): + entrances: + Outside The Bold: + room: Outside The Bold + door: Steady Entrance + The Steady (Lilac): + room: The Steady + door: Reveal + The Steady (Ruby): + door: Forward Exit + The Steady (Carnation): + door: Right Exit + panels: + SOAR: + id: Rock Room/Panel_soar_rose + colors: black + tag: topblack + doors: + Forward Exit: + event: True + panels: + - SOAR + Right Exit: + event: True + panels: + - room: The Steady (Lilac) + panel: LIE LACK + The Steady (Ruby): + entrances: + The Steady (Rose): + room: The Steady (Rose) + door: Forward Exit + The Steady (Amethyst): + room: The Steady + door: Reveal + The Steady (Cherry): + door: Forward Exit + The Steady (Amber): + door: Right Exit + panels: + BURY: + id: Rock Room/Panel_bury_ruby + colors: yellow + tag: midyellow + doors: + Forward Exit: + event: True + panels: + - room: The Steady (Lime) + panel: LIMELIGHT + Right Exit: + event: True + panels: + - room: The Steady (Carnation) + panel: INCARNATION + The Steady (Carnation): + entrances: + The Steady (Rose): + room: The Steady (Rose) + door: Right Exit + Outside The Bold: + room: The Steady + door: Reveal + The Steady (Amber): + room: The Steady + door: Reveal + The Steady (Sunflower): + door: Right Exit + panels: + INCARNATION: + id: Rock Room/Panel_incarnation_carnation + colors: red + tag: midred + doors: + Right Exit: + event: True + panels: + - room: The Steady (Amethyst) + panel: PACIFIST + The Steady (Sunflower): + entrances: + The Steady (Carnation): + room: The Steady (Carnation) + door: Right Exit + The Steady (Topaz): + room: The Steady (Topaz) + door: Back Exit + panels: + SUN: + id: Rock Room/Panel_sun_sunflower + colors: blue + tag: midblue + doors: + Back Exit: + event: True + panels: + - SUN + The Steady (Plum): + entrances: + The Steady (Amethyst): + room: The Steady + door: Reveal + The Steady (Blueberry): + room: The Steady + door: Reveal + The Steady (Cherry): + room: The Steady (Cherry) + door: Left Exit + panels: + LUMP: + id: Rock Room/Panel_lump_plum + colors: yellow + tag: midyellow + The Steady (Lime): + entrances: + The Steady (Sunflower): True + The Steady (Emerald): + room: The Steady + door: Reveal + The Steady (Blueberry): + door: Right Exit + panels: + LIMELIGHT: + id: Rock Room/Panel_limelight_lime + colors: red + tag: midred + doors: + Right Exit: + event: True + panels: + - room: The Steady (Amber) + panel: ANTECHAMBER + paintings: + - id: pencil_painting5 + orientation: south + The Steady (Lemon): + entrances: + The Steady (Emerald): True + The Steady (Orange): + room: The Steady + door: Reveal + The Steady (Topaz): + door: Back Exit + panels: + MELON: + id: Rock Room/Panel_melon_lemon + colors: yellow + tag: midyellow + doors: + Back Exit: + event: True + panels: + - MELON + paintings: + - id: pencil_painting4 + orientation: south + The Steady (Topaz): + entrances: + The Steady (Lemon): + room: The Steady (Lemon) + door: Back Exit + The Steady (Amber): + room: The Steady + door: Reveal + The Steady (Sunflower): + door: Back Exit + panels: + TOP: + id: Rock Room/Panel_top_topaz + colors: blue + tag: midblue + MASTERY: + id: Master Room/Panel_mastery_mastery2 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + doors: + Back Exit: + event: True + panels: + - TOP + The Steady (Orange): + entrances: + The Steady (Cherry): + room: The Steady + door: Reveal + The Steady (Lemon): + room: The Steady + door: Reveal + The Steady (Amber): + room: The Steady (Amber) + door: Forward Exit + panels: + BLUE: + id: Rock Room/Panel_blue_orange + colors: black + tag: botblack + The Steady (Sapphire): + entrances: + The Steady (Emerald): + door: Left Exit + The Steady (Blueberry): + room: The Steady + door: Reveal + The Steady (Amethyst): + room: The Steady (Amethyst) + door: Left Exit + panels: + SAP: + id: Rock Room/Panel_sap_sapphire + colors: blue + tag: midblue + doors: + Left Exit: + event: True + panels: + - room: The Steady (Plum) + panel: LUMP + - room: The Steady (Orange) + panel: BLUE + The Steady (Blueberry): + entrances: + The Steady (Lime): + room: The Steady (Lime) + door: Right Exit + The Steady (Sapphire): + room: The Steady + door: Reveal + The Steady (Plum): + room: The Steady + door: Reveal + panels: + BLUE: + id: Rock Room/Panel_blue_blueberry + colors: blue + tag: midblue + The Steady (Amber): + entrances: + The Steady (Ruby): + room: The Steady (Ruby) + door: Right Exit + The Steady (Carnation): + room: The Steady + door: Reveal + The Steady (Orange): + door: Forward Exit + The Steady (Topaz): + room: The Steady + door: Reveal + panels: + ANTECHAMBER: + id: Rock Room/Panel_antechamber_amber + colors: red + tag: midred + doors: + Forward Exit: + event: True + panels: + - room: The Steady (Blueberry) + panel: BLUE + The Steady (Emerald): + entrances: + The Steady (Sapphire): + room: The Steady (Sapphire) + door: Left Exit + The Steady (Lime): + room: The Steady + door: Reveal + panels: + HERALD: + id: Rock Room/Panel_herald_emerald + colors: purple + tag: midpurp + The Steady (Amethyst): + entrances: + The Steady (Lilac): + room: The Steady (Lilac) + door: Forward Exit + The Steady (Sapphire): + door: Left Exit + The Steady (Plum): + room: The Steady + door: Reveal + The Steady (Ruby): + room: The Steady + door: Reveal + panels: + PACIFIST: + id: Rock Room/Panel_thistle_amethyst + colors: purple + tag: toppurp + doors: + Left Exit: + event: True + panels: + - room: The Steady (Sunflower) + panel: SUN + The Steady (Lilac): + entrances: + Outside The Bold: + room: Outside The Bold + door: Lilac Entrance + The Steady (Amethyst): + door: Forward Exit + The Steady (Rose): + room: The Steady + door: Reveal + panels: + LIE LACK: + id: Rock Room/Panel_lielack_lilac + tag: topwhite + doors: + Forward Exit: + event: True + panels: + - room: The Steady (Ruby) + panel: BURY + The Steady (Cherry): + entrances: + The Steady (Plum): + door: Left Exit + The Steady (Orange): + room: The Steady + door: Reveal + The Steady (Ruby): + room: The Steady (Ruby) + door: Forward Exit + panels: + HAIRY: + id: Rock Room/Panel_hairy_cherry + colors: blue + tag: topblue + doors: + Left Exit: + event: True + panels: + - room: The Steady (Sapphire) + panel: SAP + The Steady: + entrances: + The Steady (Sunflower): + room: The Steady (Sunflower) + door: Back Exit + panels: + Achievement: + id: Countdown Panels/Panel_steady_steady + required_panel: + - room: The Steady (Rose) + panel: SOAR + - room: The Steady (Carnation) + panel: INCARNATION + - room: The Steady (Sunflower) + panel: SUN + - room: The Steady (Ruby) + panel: BURY + - room: The Steady (Plum) + panel: LUMP + - room: The Steady (Lime) + panel: LIMELIGHT + - room: The Steady (Lemon) + panel: MELON + - room: The Steady (Topaz) + panel: TOP + - room: The Steady (Orange) + panel: BLUE + - room: The Steady (Sapphire) + panel: SAP + - room: The Steady (Blueberry) + panel: BLUE + - room: The Steady (Amber) + panel: ANTECHAMBER + - room: The Steady (Emerald) + panel: HERALD + - room: The Steady (Amethyst) + panel: PACIFIST + - room: The Steady (Lilac) + panel: LIE LACK + - room: The Steady (Cherry) + panel: HAIRY + tag: forbid + check: True + achievement: The Steady + doors: + Reveal: + event: True + panels: + - Achievement + Knight Night (Outer Ring): + entrances: + Hidden Room: + room: Hidden Room + door: Knight Night Entrance + Knight Night Exit: True + panels: + NIGHT: + id: Appendix Room/Panel_night_knight + colors: blue + tag: homophone midblue + copy_to_sign: sign7 + KNIGHT: + id: Appendix Room/Panel_knight_night + colors: red + tag: homophone midred + copy_to_sign: sign8 + BEE: + id: Appendix Room/Panel_bee_be + colors: red + tag: homophone midred + copy_to_sign: sign9 + NEW: + id: Appendix Room/Panel_new_knew + colors: blue + tag: homophone midblue + copy_to_sign: sign11 + FORE: + id: Appendix Room/Panel_fore_for + colors: red + tag: homophone midred + copy_to_sign: sign10 + TRUSTED (1): + id: Appendix Room/Panel_trusted_trust + colors: red + tag: midred + required_panel: + room: Knight Night (Right Lower Segment) + panel: BEFORE + TRUSTED (2): + id: Appendix Room/Panel_trusted_rusted + colors: red + tag: midred + required_panel: + room: Knight Night (Right Lower Segment) + panel: BEFORE + ENCRUSTED: + id: Appendix Room/Panel_encrusted_rust + colors: red + tag: midred + required_panel: + - panel: TRUSTED (1) + - panel: TRUSTED (2) + ADJUST (1): + id: Appendix Room/Panel_adjust_readjust + colors: blue + tag: midblue and phone + required_panel: + room: Knight Night (Right Lower Segment) + panel: BE + ADJUST (2): + id: Appendix Room/Panel_adjust_adjusted + colors: blue + tag: midblue and phone + required_panel: + room: Knight Night (Right Lower Segment) + panel: BE + RIGHT: + id: Appendix Room/Panel_right_right + tag: midwhite + required_panel: + room: Knight Night (Right Lower Segment) + panel: ADJUST + TRUST: + id: Appendix Room/Panel_trust_crust + colors: + - red + - blue + tag: mid red blue + required_panel: + - room: Knight Night (Right Lower Segment) + panel: ADJUST + - room: Knight Night (Right Lower Segment) + panel: LEFT + doors: + Fore Door: + event: True + panels: + - FORE + New Door: + event: True + panels: + - NEW + To End: + event: True + panels: + - RIGHT + - room: Knight Night (Right Lower Segment) + panel: LEFT + Knight Night (Right Upper Segment): + entrances: + Knight Night Exit: True + Knight Night (Outer Ring): + room: Knight Night (Outer Ring) + door: Fore Door + Knight Night (Right Lower Segment): + door: Segment Door + panels: + RUST (1): + id: Appendix Room/Panel_rust_trust + colors: blue + tag: midblue + required_panel: + room: Knight Night (Outer Ring) + panel: BEE + RUST (2): + id: Appendix Room/Panel_rust_crust + colors: blue + tag: midblue + required_panel: + room: Knight Night (Outer Ring) + panel: BEE + doors: + Segment Door: + event: True + panels: + - RUST (2) + - room: Knight Night (Right Lower Segment) + panel: BEFORE + Knight Night (Right Lower Segment): + entrances: + Knight Night Exit: True + Knight Night (Right Upper Segment): + room: Knight Night (Right Upper Segment) + door: Segment Door + Knight Night (Outer Ring): + room: Knight Night (Outer Ring) + door: New Door + panels: + ADJUST: + id: Appendix Room/Panel_adjust_readjusted + colors: blue + tag: midblue + required_panel: + - room: Knight Night (Outer Ring) + panel: ADJUST (1) + - room: Knight Night (Outer Ring) + panel: ADJUST (2) + BEFORE: + id: Appendix Room/Panel_before_fore + colors: red + tag: midred and phone + required_panel: + room: Knight Night (Right Upper Segment) + panel: RUST (1) + BE: + id: Appendix Room/Panel_be_before + colors: blue + tag: midblue and phone + required_panel: + room: Knight Night (Right Upper Segment) + panel: RUST (1) + LEFT: + id: Appendix Room/Panel_left_left + tag: midwhite + required_panel: + room: Knight Night (Outer Ring) + panel: ENCRUSTED + TRUST: + id: Appendix Room/Panel_trust_crust_2 + colors: purple + tag: midpurp + required_panel: + - room: Knight Night (Outer Ring) + panel: ENCRUSTED + - room: Knight Night (Outer Ring) + panel: RIGHT + Knight Night (Final): + entrances: + Knight Night Exit: True + Knight Night (Outer Ring): + room: Knight Night (Outer Ring) + door: To End + Knight Night (Right Upper Segment): + room: Knight Night (Outer Ring) + door: To End + panels: + TRUSTED: + id: Appendix Room/Panel_trusted_readjusted + colors: purple + tag: midpurp + doors: + Exit: + id: + - Appendix Room Area Doors/Door_trusted_readjusted + - Appendix Room Area Doors/Door_trusted_readjusted2 + - Appendix Room Area Doors/Door_trusted_readjusted3 + - Appendix Room Area Doors/Door_trusted_readjusted4 + - Appendix Room Area Doors/Door_trusted_readjusted5 + - Appendix Room Area Doors/Door_trusted_readjusted6 + - Appendix Room Area Doors/Door_trusted_readjusted7 + - Appendix Room Area Doors/Door_trusted_readjusted8 + - Appendix Room Area Doors/Door_trusted_readjusted9 + - Appendix Room Area Doors/Door_trusted_readjusted10 + - Appendix Room Area Doors/Door_trusted_readjusted11 + - Appendix Room Area Doors/Door_trusted_readjusted12 + - Appendix Room Area Doors/Door_trusted_readjusted13 + include_reduce: True + location_name: Knight Night Room - TRUSTED + item_name: Knight Night Room - Exit + panels: + - TRUSTED + Knight Night Exit: + entrances: + Knight Night (Outer Ring): + room: Knight Night (Final) + door: Exit + Orange Tower Third Floor: + room: Knight Night (Final) + door: Exit + Outside The Initiated: + room: Knight Night (Final) + door: Exit + panels: + SEVEN (1): + id: Backside Room/Panel_seven_seven_7 + tag: midwhite + required_door: + - room: Number Hunt + door: Sevens + SEVEN (2): + id: Backside Room/Panel_seven_seven_3 + tag: midwhite + required_door: + - room: Number Hunt + door: Sevens + SEVEN (3): + id: Backside Room/Panel_seven_seven_4 + tag: midwhite + required_door: + - room: Number Hunt + door: Sevens + DEAD END: + id: Appendix Room/Panel_deadend_deadend + tag: midwhite + WARNER: + id: Appendix Room/Panel_warner_corner + colors: purple + tag: toppurp + The Artistic (Smiley): + entrances: + Dead End Area: + painting: True + Crossroads: + painting: True + Hot Crusts Area: + painting: True + Outside The Initiated: + painting: True + Directional Gallery: + painting: True + Number Hunt: + room: Number Hunt + door: Eights + painting: True + Art Gallery: + painting: True + The Eyes They See: + painting: True + The Artistic (Panda): + door: Door to Panda + The Artistic (Apple): + room: The Artistic (Apple) + door: Door to Smiley + Elements Area: + room: Hallway Room (4) + door: Exit + panels: + Achievement: + id: Countdown Panels/Panel_artistic_artistic + colors: + - red + - black + - yellow + - blue + tag: forbid + required_room: + - The Artistic (Panda) + - The Artistic (Apple) + - The Artistic (Lattice) + check: True + achievement: The Artistic + FINE: + id: Ceiling Room/Panel_yellow_top_5 + colors: + - yellow + - blue + tag: yellow top blue bot + subtag: top + link: yxu KNIFE + BLADE: + id: Ceiling Room/Panel_blue_bot_5 + colors: + - blue + - yellow + tag: yellow top blue bot + subtag: bot + link: yxu KNIFE + RED: + id: Ceiling Room/Panel_blue_top_6 + colors: + - blue + - yellow + tag: blue top yellow mid + subtag: top + link: uyx BREAD + BEARD: + id: Ceiling Room/Panel_yellow_mid_6 + colors: + - yellow + - blue + tag: blue top yellow mid + subtag: mid + link: uyx BREAD + ICE: + id: Ceiling Room/Panel_blue_mid_7 + colors: + - blue + - yellow + tag: blue mid yellow bot + subtag: mid + link: xuy SPICE + ROOT: + id: Ceiling Room/Panel_yellow_bot_7 + colors: + - yellow + - blue + tag: blue mid yellow bot + subtag: bot + link: xuy SPICE + doors: + Door to Panda: + id: + - Ceiling Room Doors/Door_blue + - Ceiling Room Doors/Door_blue2 + location_name: The Artistic - Smiley and Panda + group: Artistic Doors + panels: + - FINE + - BLADE + - RED + - BEARD + - ICE + - ROOT + - room: The Artistic (Panda) + panel: EYE (Top) + - room: The Artistic (Panda) + panel: EYE (Bottom) + - room: The Artistic (Panda) + panel: LADYLIKE + - room: The Artistic (Panda) + panel: WATER + - room: The Artistic (Panda) + panel: OURS + - room: The Artistic (Panda) + panel: DAYS + - room: The Artistic (Panda) + panel: NIGHTTIME + - room: The Artistic (Panda) + panel: NIGHT + paintings: + - id: smile_painting_9 + orientation: north + exit_only: True + The Artistic (Panda): + entrances: + Orange Tower Sixth Floor: + painting: True + Outside The Agreeable: + painting: True + The Artistic (Smiley): + room: The Artistic (Smiley) + door: Door to Panda + The Artistic (Lattice): + door: Door to Lattice + panels: + EYE (Top): + id: Ceiling Room/Panel_blue_top_1 + colors: + - blue + - red + tag: blue top red bot + subtag: top + link: uxr IRIS + EYE (Bottom): + id: Ceiling Room/Panel_red_bot_1 + colors: + - red + - blue + tag: blue top red bot + subtag: bot + link: uxr IRIS + LADYLIKE: + id: Ceiling Room/Panel_red_mid_2 + colors: + - red + - blue + tag: red mid blue bot + subtag: mid + link: xru LAKE + WATER: + id: Ceiling Room/Panel_blue_bot_2 + colors: + - blue + - red + tag: red mid blue bot + subtag: bot + link: xru LAKE + OURS: + id: Ceiling Room/Panel_blue_mid_3 + colors: + - blue + - red + tag: blue mid red bot + subtag: mid + link: xur HOURS + DAYS: + id: Ceiling Room/Panel_red_bot_3 + colors: + - red + - blue + tag: blue mid red bot + subtag: bot + link: xur HOURS + NIGHTTIME: + id: Ceiling Room/Panel_red_top_4 + colors: + - red + - blue + tag: red top mid blue + subtag: top + link: rux KNIGHT + NIGHT: + id: Ceiling Room/Panel_blue_mid_4 + colors: + - blue + - red + tag: red top mid blue + subtag: mid + link: rux KNIGHT + doors: + Door to Lattice: + id: + - Ceiling Room Doors/Door_red + - Ceiling Room Doors/Door_red2 + location_name: The Artistic - Panda and Lattice + group: Artistic Doors + panels: + - EYE (Top) + - EYE (Bottom) + - LADYLIKE + - WATER + - OURS + - DAYS + - NIGHTTIME + - NIGHT + - room: The Artistic (Lattice) + panel: POSH + - room: The Artistic (Lattice) + panel: MALL + - room: The Artistic (Lattice) + panel: DEICIDE + - room: The Artistic (Lattice) + panel: WAVER + - room: The Artistic (Lattice) + panel: REPAID + - room: The Artistic (Lattice) + panel: BABY + - room: The Artistic (Lattice) + panel: LOBE + - room: The Artistic (Lattice) + panel: BOWELS + paintings: + - id: panda_painting_3 + exit_only: True + orientation: south + required_when_no_doors: True + The Artistic (Lattice): + entrances: + Directional Gallery: + painting: True + The Artistic (Panda): + room: The Artistic (Panda) + door: Door to Lattice + The Artistic (Apple): + door: Door to Apple + panels: + POSH: + id: Ceiling Room/Panel_black_top_12 + colors: + - black + - red + tag: black top red bot + subtag: top + link: bxr SHOP + MALL: + id: Ceiling Room/Panel_red_bot_12 + colors: + - red + - black + tag: black top red bot + subtag: bot + link: bxr SHOP + DEICIDE: + id: Ceiling Room/Panel_red_top_13 + colors: + - red + - black + tag: red top black bot + subtag: top + link: rxb DECIDE + WAVER: + id: Ceiling Room/Panel_black_bot_13 + colors: + - black + - red + tag: red top black bot + subtag: bot + link: rxb DECIDE + REPAID: + id: Ceiling Room/Panel_black_mid_14 + colors: + - black + - red + tag: black mid red bot + subtag: mid + link: xbr DIAPER + BABY: + id: Ceiling Room/Panel_red_bot_14 + colors: + - red + - black + tag: black mid red bot + subtag: bot + link: xbr DIAPER + LOBE: + id: Ceiling Room/Panel_black_top_15 + colors: + - black + - red + tag: black top red mid + subtag: top + link: brx BOWL + BOWELS: + id: Ceiling Room/Panel_red_mid_15 + colors: + - red + - black + tag: black top red mid + subtag: mid + link: brx BOWL + doors: + Door to Apple: + id: + - Ceiling Room Doors/Door_black + - Ceiling Room Doors/Door_black2 + location_name: The Artistic - Lattice and Apple + group: Artistic Doors + panels: + - POSH + - MALL + - DEICIDE + - WAVER + - REPAID + - BABY + - LOBE + - BOWELS + - room: The Artistic (Apple) + panel: SPRIG + - room: The Artistic (Apple) + panel: RELEASES + - room: The Artistic (Apple) + panel: MUCH + - room: The Artistic (Apple) + panel: FISH + - room: The Artistic (Apple) + panel: MASK + - room: The Artistic (Apple) + panel: HILL + - room: The Artistic (Apple) + panel: TINE + - room: The Artistic (Apple) + panel: THING + paintings: + - id: boxes_painting2 + orientation: south + exit_only: True + required_when_no_doors: True + The Artistic (Apple): + entrances: + Orange Tower Sixth Floor: + painting: True + Directional Gallery: + painting: True + The Artistic (Lattice): + room: The Artistic (Lattice) + door: Door to Apple + The Artistic (Smiley): + door: Door to Smiley + panels: + SPRIG: + id: Ceiling Room/Panel_yellow_mid_8 + colors: + - yellow + - black + tag: yellow mid black bot + subtag: mid + link: xyb GRIPS + RELEASES: + id: Ceiling Room/Panel_black_bot_8 + colors: + - black + - yellow + tag: yellow mid black bot + subtag: bot + link: xyb GRIPS + MUCH: + id: Ceiling Room/Panel_black_top_9 + colors: + - black + - yellow + tag: black top yellow bot + subtag: top + link: bxy CHUM + FISH: + id: Ceiling Room/Panel_yellow_bot_9 + colors: + - yellow + - black + tag: black top yellow bot + subtag: bot + link: bxy CHUM + MASK: + id: Ceiling Room/Panel_yellow_top_10 + colors: + - yellow + - black + tag: yellow top black bot + subtag: top + link: yxb CHASM + HILL: + id: Ceiling Room/Panel_black_bot_10 + colors: + - black + - yellow + tag: yellow top black bot + subtag: bot + link: yxb CHASM + TINE: + id: Ceiling Room/Panel_black_top_11 + colors: + - black + - yellow + tag: black top yellow mid + subtag: top + link: byx NIGHT + THING: + id: Ceiling Room/Panel_yellow_mid_11 + colors: + - yellow + - black + tag: black top yellow mid + subtag: mid + link: byx NIGHT + doors: + Door to Smiley: + id: + - Ceiling Room Doors/Door_yellow + - Ceiling Room Doors/Door_yellow2 + location_name: The Artistic - Apple and Smiley + group: Artistic Doors + panels: + - SPRIG + - RELEASES + - MUCH + - FISH + - MASK + - HILL + - TINE + - THING + - room: The Artistic (Smiley) + panel: FINE + - room: The Artistic (Smiley) + panel: BLADE + - room: The Artistic (Smiley) + panel: RED + - room: The Artistic (Smiley) + panel: BEARD + - room: The Artistic (Smiley) + panel: ICE + - room: The Artistic (Smiley) + panel: ROOT + paintings: + - id: cherry_painting3 + orientation: north + exit_only: True + required_when_no_doors: True + The Artistic (Hint Room): + entrances: + The Artistic (Lattice): + room: The Artistic (Lattice) + door: Door to Apple + panels: + THEME: + id: Ceiling Room/Panel_answer_1 + colors: red + tag: midred + PAINTS: + id: Ceiling Room/Panel_answer_2 + colors: yellow + tag: botyellow + I: + id: Ceiling Room/Panel_answer_3 + colors: blue + tag: midblue + KIT: + id: Ceiling Room/Panel_answer_4 + colors: black + tag: topblack + The Discerning: + entrances: + Crossroads: + room: Crossroads + door: Discerning Entrance + panels: + Achievement: + id: Countdown Panels/Panel_discerning_scramble + colors: yellow + tag: forbid + check: True + achievement: The Discerning + HITS: + id: Sun Room/Panel_hits_this + colors: yellow + tag: midyellow + WARRED: + id: Sun Room/Panel_warred_drawer + colors: yellow + tag: double midyellow + subtag: left + link: ana DRAWER + REDRAW: + id: Sun Room/Panel_redraw_drawer + colors: yellow + tag: double midyellow + subtag: right + link: ana DRAWER + ADDER: + id: Sun Room/Panel_adder_dread + colors: yellow + tag: midyellow + LAUGHTERS: + id: Sun Room/Panel_laughters_slaughter + colors: yellow + tag: midyellow + STONE: + id: Sun Room/Panel_stone_notes + colors: yellow + tag: double midyellow + subtag: left + link: ana NOTES + ONSET: + id: Sun Room/Panel_onset_notes + colors: yellow + tag: double midyellow + subtag: right + link: ana NOTES + RAT: + id: Sun Room/Panel_rat_art + colors: yellow + tag: midyellow + DUSTY: + id: Sun Room/Panel_dusty_study + colors: yellow + tag: midyellow + ARTS: + id: Sun Room/Panel_arts_star + colors: yellow + tag: double midyellow + subtag: left + link: ana STAR + TSAR: + id: Sun Room/Panel_tsar_star + colors: yellow + tag: double midyellow + subtag: right + link: ana STAR + STATE: + id: Sun Room/Panel_state_taste + colors: yellow + tag: midyellow + REACT: + id: Sun Room/Panel_react_trace + colors: yellow + tag: midyellow + DEAR: + id: Sun Room/Panel_dear_read + colors: yellow + tag: double midyellow + subtag: left + link: ana READ + DARE: + id: Sun Room/Panel_dare_read + colors: yellow + tag: double midyellow + subtag: right + link: ana READ + SEAM: + id: Sun Room/Panel_seam_same + colors: yellow + tag: midyellow + The Eyes They See: + entrances: + Crossroads: + room: Crossroads + door: Eye Wall + painting: True + Wondrous Lobby: + door: Exit + Directional Gallery: True + panels: + NEAR: + id: Shuffle Room/Panel_near_near + tag: midwhite + EIGHT: + id: Backside Room/Panel_eight_eight_4 + tag: midwhite + required_door: + room: Number Hunt + door: Eights + doors: + Exit: + id: Count Up Room Area Doors/Door_near_near + group: Crossroads Doors + panels: + - NEAR + paintings: + - id: eye_painting_2 + orientation: west + - id: smile_painting_2 + orientation: north + Far Window: + entrances: + Crossroads: + room: Crossroads + door: Eye Wall + The Eyes They See: True + panels: + FAR: + id: Shuffle Room/Panel_far_far + tag: midwhite + Wondrous Lobby: + entrances: + Directional Gallery: True + The Eyes They See: + room: The Eyes They See + door: Exit + paintings: + - id: arrows_painting_5 + orientation: east + Outside The Wondrous: + entrances: + Wondrous Lobby: True + The Wondrous (Doorknob): + door: Wondrous Entrance + The Wondrous (Window): True + panels: + SHRINK: + id: Wonderland Room/Panel_shrink_shrink + tag: midwhite + doors: + Wondrous Entrance: + id: Red Blue Purple Room Area Doors/Door_wonderland + item_name: The Wondrous - Entrance + panels: + - SHRINK + The Wondrous (Doorknob): + entrances: + Outside The Wondrous: + room: Outside The Wondrous + door: Wondrous Entrance + Starting Room: + door: Painting Shortcut + painting: True + The Wondrous (Chandelier): + painting: True + The Wondrous (Table): True # There is a way that doesn't use the painting + doors: + Painting Shortcut: + painting_id: + - symmetry_painting_a_starter + - arrows_painting2 + skip_location: True + item_name: Starting Room - Symmetry Painting + panels: + - room: Outside The Wondrous + panel: SHRINK + paintings: + - id: symmetry_painting_a_1 + orientation: east + exit_only: True + - id: symmetry_painting_b_1 + orientation: south + The Wondrous (Bookcase): + entrances: + The Wondrous (Doorknob): True + panels: + CASE: + id: Wonderland Room/Panel_case_bookcase + colors: blue + tag: midblue + paintings: + - id: symmetry_painting_a_3 + orientation: west + exit_only: True + - id: symmetry_painting_b_3 + disable: True + The Wondrous (Chandelier): + entrances: + The Wondrous (Bookcase): True + panels: + CANDLE HEIR: + id: Wonderland Room/Panel_candleheir_chandelier + colors: yellow + tag: midyellow + paintings: + - id: symmetry_painting_a_5 + orientation: east + - id: symmetry_painting_a_5 + disable: True + The Wondrous (Window): + entrances: + The Wondrous (Bookcase): True + panels: + GLASS: + id: Wonderland Room/Panel_glass_window + colors: brown + tag: botbrown + paintings: + - id: symmetry_painting_b_4 + orientation: north + exit_only: True + - id: symmetry_painting_a_4 + disable: True + The Wondrous (Table): + entrances: + The Wondrous (Doorknob): + painting: True + The Wondrous: + painting: True + panels: + WOOD: + id: Wonderland Room/Panel_wood_table + colors: brown + tag: botbrown + BROOK NOD: + # This panel, while physically being in the first room, is facing upward + # and is only really solvable while standing on the windowsill, which is + # a location you can only get to from Table. + id: Wonderland Room/Panel_brooknod_doorknob + colors: yellow + tag: midyellow + paintings: + - id: symmetry_painting_a_2 + orientation: west + - id: symmetry_painting_b_2 + orientation: south + exit_only: True + required: True + The Wondrous: + entrances: + The Wondrous (Table): True + Arrow Garden: + door: Exit + panels: + FIREPLACE: + id: Wonderland Room/Panel_fireplace_fire + colors: red + tag: midred + Achievement: + id: Countdown Panels/Panel_wondrous_wondrous + required_panel: + - panel: FIREPLACE + - room: The Wondrous (Table) + panel: BROOK NOD + - room: The Wondrous (Bookcase) + panel: CASE + - room: The Wondrous (Chandelier) + panel: CANDLE HEIR + - room: The Wondrous (Window) + panel: GLASS + - room: The Wondrous (Table) + panel: WOOD + tag: forbid + achievement: The Wondrous + doors: + Exit: + id: Red Blue Purple Room Area Doors/Door_wonderland_exit + painting_id: arrows_painting_9 + include_reduce: True + panels: + - Achievement + paintings: + - id: arrows_painting_9 + enter_only: True + orientation: south + move: True + required_door: + door: Exit + req_blocked_when_no_doors: True # the wondrous (table) in vanilla doors + - id: symmetry_painting_a_6 + orientation: west + exit_only: True + - id: symmetry_painting_b_6 + orientation: north + req_blocked_when_no_doors: True # the wondrous (table) in vanilla doors + Arrow Garden: + entrances: + The Wondrous: + room: The Wondrous + door: Exit + Roof: True + panels: + MASTERY: + id: Master Room/Panel_mastery_mastery4 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + SHARP: + id: Open Areas/Panel_rainy_rainbow2 + tag: midwhite + paintings: + - id: flower_painting_6 + orientation: south + Hallway Room (2): + entrances: + Outside The Agreeable: + room: Outside The Agreeable + door: Hallway Door + Elements Area: True + panels: + WISE: + id: Hallway Room/Panel_counterclockwise_1 + colors: blue + tag: quad mid blue + link: qmb COUNTERCLOCKWISE + CLOCK: + id: Hallway Room/Panel_counterclockwise_2 + colors: blue + tag: quad mid blue + link: qmb COUNTERCLOCKWISE + ER: + id: Hallway Room/Panel_counterclockwise_3 + colors: blue + tag: quad mid blue + link: qmb COUNTERCLOCKWISE + COUNT: + id: Hallway Room/Panel_counterclockwise_4 + colors: blue + tag: quad mid blue + link: qmb COUNTERCLOCKWISE + doors: + Exit: + id: Red Blue Purple Room Area Doors/Door_room_3 + location_name: Hallway Room - Second Room + group: Hallway Room Doors + panels: + - WISE + - CLOCK + - ER + - COUNT + Hallway Room (3): + entrances: + Hallway Room (2): + room: Hallway Room (2) + door: Exit + # No entrance from Elements Area. The winding hallway does not connect. + panels: + TRANCE: + id: Hallway Room/Panel_transformation_1 + colors: blue + tag: quad top blue + link: qtb TRANSFORMATION + FORM: + id: Hallway Room/Panel_transformation_2 + colors: blue + tag: quad top blue + link: qtb TRANSFORMATION + A: + id: Hallway Room/Panel_transformation_3 + colors: blue + tag: quad top blue + link: qtb TRANSFORMATION + SHUN: + id: Hallway Room/Panel_transformation_4 + colors: blue + tag: quad top blue + link: qtb TRANSFORMATION + doors: + Exit: + id: Red Blue Purple Room Area Doors/Door_room_4 + location_name: Hallway Room - Third Room + group: Hallway Room Doors + panels: + - TRANCE + - FORM + - A + - SHUN + Hallway Room (4): + entrances: + Hallway Room (3): + room: Hallway Room (3) + door: Exit + Elements Area: True + panels: + WHEEL: + id: Hallway Room/Panel_room_5 + colors: blue + tag: full stack blue + doors: + Exit: + id: + - Red Blue Purple Room Area Doors/Door_room_5 + - Red Blue Purple Room Area Doors/Door_room_6 # this is the connection to The Artistic + group: Hallway Room Doors + location_name: Hallway Room - Fourth Room + panels: + - WHEEL + include_reduce: True + Elements Area: + entrances: + Roof: True + Hallway Room (4): + room: Hallway Room (4) + door: Exit + The Artistic (Smiley): + room: Hallway Room (4) + door: Exit + panels: + A: + id: Strand Room/Panel_a_strands + colors: blue + tag: forbid + NINE: + id: Backside Room/Panel_nine_nine_7 + tag: midwhite + required_door: + room: Number Hunt + door: Nines + UNDISTRACTED: + id: Open Areas/Panel_undistracted + check: True + exclude_reduce: True + tag: midwhite + MASTERY: + id: Master Room/Panel_mastery_mastery13 + tag: midwhite + required_door: + room: Orange Tower Seventh Floor + door: Mastery + EARTH: + id: Cross Room/Panel_earth_earth + tag: midwhite + WATER: + id: Cross Room/Panel_water_water + tag: midwhite + AIR: + id: Cross Room/Panel_air_air + tag: midwhite + paintings: + - id: south_afar + orientation: south + Outside The Wanderer: + entrances: + Orange Tower First Floor: + door: Tower Entrance + Rhyme Room (Cross): + room: Rhyme Room (Cross) + door: Exit + Roof: True + panels: + WANDERLUST: + id: Tower Room/Panel_wanderlust_1234567890 + colors: orange + tag: midorange + doors: + Wanderer Entrance: + id: Tower Room Area Doors/Door_wanderer_entrance + item_name: The Wanderer - Entrance + panels: + - WANDERLUST + Tower Entrance: + id: Tower Room Area Doors/Door_wanderlust_start + skip_location: True + panels: + - room: The Wanderer + panel: Achievement + The Wanderer: + entrances: + Outside The Wanderer: + room: Outside The Wanderer + door: Wanderer Entrance + panels: + Achievement: + id: Countdown Panels/Panel_1234567890_wanderlust + colors: orange + check: True + tag: forbid + achievement: The Wanderer + "7890": + id: Orange Room/Panel_lust + colors: orange + tag: midorange + "6524": + id: Orange Room/Panel_read + colors: orange + tag: midorange + "951": + id: Orange Room/Panel_sew + colors: orange + tag: midorange + "4524": + id: Orange Room/Panel_dead + colors: orange + tag: midorange + LEARN: + id: Orange Room/Panel_learn + colors: orange + tag: midorange + DUST: + id: Orange Room/Panel_dust + colors: orange + tag: midorange + STAR: + id: Orange Room/Panel_star + colors: orange + tag: midorange + WANDER: + id: Orange Room/Panel_wander + colors: orange + tag: midorange + Art Gallery: + entrances: + Orange Tower Third Floor: True + Art Gallery (Second Floor): True + Art Gallery (Third Floor): True + Art Gallery (Fourth Floor): True + Orange Tower Fifth Floor: + door: Exit + panels: + EIGHT: + id: Backside Room/Panel_eight_eight_6 + tag: midwhite + required_door: + room: Number Hunt + door: Eights + EON: + id: Painting Room/Panel_eon_one + colors: yellow + tag: midyellow + TRUSTWORTHY: + id: Painting Room/Panel_to_two + colors: red + tag: midred + FREE: + id: Painting Room/Panel_free_three + colors: purple + tag: midpurp + OUR: + id: Painting Room/Panel_our_four + colors: blue + tag: midblue + ONE ROAD MANY TURNS: + id: Painting Room/Panel_order_onepathmanyturns + tag: forbid + colors: + - yellow + - blue + - gray + - brown + - orange + required_door: + door: Fifth Floor + doors: + Second Floor: + painting_id: + - scenery_painting_2b + - scenery_painting_2c + skip_location: True + panels: + - EON + First Floor Puzzles: + skip_item: True + location_name: Art Gallery - First Floor Puzzles + panels: + - EON + - TRUSTWORTHY + - FREE + - OUR + Third Floor: + painting_id: + - scenery_painting_3b + - scenery_painting_3c + skip_location: True + panels: + - room: Art Gallery (Second Floor) + panel: PATH + Fourth Floor: + painting_id: + - scenery_painting_4b + - scenery_painting_4c + skip_location: True + panels: + - room: Art Gallery (Third Floor) + panel: ANY + Fifth Floor: + id: Tower Room Area Doors/Door_painting_backroom + painting_id: + - scenery_painting_5b + - scenery_painting_5c + skip_location: True + panels: + - room: Art Gallery (Fourth Floor) + panel: SEND - USE + Exit: + id: Tower Room Area Doors/Door_painting_exit + include_reduce: True + panels: + - ONE ROAD MANY TURNS + paintings: + - id: smile_painting_3 + orientation: west + - id: flower_painting_2 + orientation: east + - id: scenery_painting_0a + orientation: north + - id: map_painting + orientation: east + - id: fruitbowl_painting4 + orientation: south + progression: + Progressive Art Gallery: + - Second Floor + - Third Floor + - Fourth Floor + - Fifth Floor + - Exit + Art Gallery (Second Floor): + entrances: + Art Gallery: + room: Art Gallery + door: Second Floor + panels: + HOUSE: + id: Painting Room/Panel_house_neighborhood + colors: blue + tag: botblue + PATH: + id: Painting Room/Panel_path_road + colors: brown + tag: botbrown + PARK: + id: Painting Room/Panel_park_drive + colors: black + tag: botblack + CARRIAGE: + id: Painting Room/Panel_carriage_horse + colors: red + tag: botred + doors: + Puzzles: + skip_item: True + location_name: Art Gallery - Second Floor Puzzles + panels: + - HOUSE + - PATH + - PARK + - CARRIAGE + Art Gallery (Third Floor): + entrances: + Art Gallery: + room: Art Gallery + door: Third Floor + panels: + AN: + id: Painting Room/Panel_an_many + colors: blue + tag: midblue + MAY: + id: Painting Room/Panel_may_many + colors: blue + tag: midblue + ANY: + id: Painting Room/Panel_any_many + colors: blue + tag: midblue + MAN: + id: Painting Room/Panel_man_many + colors: blue + tag: midblue + doors: + Puzzles: + skip_item: True + location_name: Art Gallery - Third Floor Puzzles + panels: + - AN + - MAY + - ANY + - MAN + Art Gallery (Fourth Floor): + entrances: + Art Gallery: + room: Art Gallery + door: Fourth Floor + panels: + URNS: + id: Painting Room/Panel_urns_turns + colors: blue + tag: midblue + LEARNS: + id: Painting Room/Panel_learns_turns + colors: purple + tag: midpurp + RUNTS: + id: Painting Room/Panel_runts_turns + colors: yellow + tag: midyellow + SEND - USE: + id: Painting Room/Panel_send_use_turns + colors: orange + tag: midorange + TRUST: + id: Painting Room/Panel_trust_06890 + colors: orange + tag: midorange + "062459": + id: Painting Room/Panel_06890_trust + colors: orange + tag: midorange + doors: + Puzzles: + skip_item: True + location_name: Art Gallery - Fourth Floor Puzzles + panels: + - URNS + - LEARNS + - RUNTS + - SEND - USE + - TRUST + - "062459" + Rhyme Room (Smiley): + entrances: + Orange Tower Third Floor: + room: Orange Tower Third Floor + door: Rhyme Room Entrance + Rhyme Room (Circle): + room: Rhyme Room (Circle) + door: Door to Smiley + Rhyme Room (Cross): True # one-way + panels: + LOANS: + id: Double Room/Panel_bones_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme BONES + SKELETON: + id: Double Room/Panel_bones_syn + tag: syn rhyme + subtag: bot + link: rhyme BONES + REPENTANCE: + id: Double Room/Panel_sentence_rhyme + colors: purple + tag: whole rhyme + subtag: top + link: rhyme SENTENCE + WORD: + id: Double Room/Panel_sentence_whole + colors: blue + tag: whole rhyme + subtag: bot + link: rhyme SENTENCE + SCHEME: + id: Double Room/Panel_dream_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme DREAM + FANTASY: + id: Double Room/Panel_dream_syn + tag: syn rhyme + subtag: bot + link: rhyme DREAM + HISTORY: + id: Double Room/Panel_mystery_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme MYSTERY + SECRET: + id: Double Room/Panel_mystery_syn + tag: syn rhyme + subtag: bot + link: rhyme MYSTERY + doors: + # This is complicated. I want the location in here to just be the four + # panels against the wall toward Target. But in vanilla, you also need to + # solve the panels in Circle that are against the Smiley wall. Logic needs + # to know this so that it can handle no door shuffle properly. So we split + # the item and location up. + Door to Target: + id: + - Double Room Area Doors/Door_room_3a + - Double Room Area Doors/Door_room_3bc + skip_location: True + group: Rhyme Room Doors + panels: + - SCHEME + - FANTASY + - HISTORY + - SECRET + - room: Rhyme Room (Circle) + panel: BIRD + - room: Rhyme Room (Circle) + panel: LETTER + - room: Rhyme Room (Circle) + panel: VIOLENT + - room: Rhyme Room (Circle) + panel: MUTE + Door to Target (Location): + location_name: Rhyme Room (Smiley) - Puzzles Toward Target + skip_item: True + panels: + - SCHEME + - FANTASY + - HISTORY + - SECRET + Rhyme Room (Cross): + entrances: + Rhyme Room (Target): # one-way + room: Rhyme Room (Target) + door: Door to Cross + Rhyme Room (Looped Square): + room: Rhyme Room (Looped Square) + door: Door to Cross + panels: + NINE: + id: Backside Room/Panel_nine_nine_9 + tag: midwhite + required_door: + room: Number Hunt + door: Nines + FERN: + id: Double Room/Panel_return_rhyme + colors: purple + tag: ant rhyme + subtag: top + link: rhyme RETURN + STAY: + id: Double Room/Panel_return_ant + colors: black + tag: ant rhyme + subtag: bot + link: rhyme RETURN + FRIEND: + id: Double Room/Panel_descend_rhyme + colors: purple + tag: ant rhyme + subtag: top + link: rhyme DESCEND + RISE: + id: Double Room/Panel_descend_ant + colors: black + tag: ant rhyme + subtag: bot + link: rhyme DESCEND + PLUMP: + id: Double Room/Panel_jump_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme JUMP + BOUNCE: + id: Double Room/Panel_jump_syn + tag: syn rhyme + subtag: bot + link: rhyme JUMP + SCRAWL: + id: Double Room/Panel_fall_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme FALL + PLUNGE: + id: Double Room/Panel_fall_syn + tag: syn rhyme + subtag: bot + link: rhyme FALL + LEAP: + id: Double Room/Panel_leap_leap + tag: midwhite + doors: + Exit: + id: Double Room Area Doors/Door_room_exit + location_name: Rhyme Room (Cross) - Exit Puzzles + group: Rhyme Room Doors + panels: + - PLUMP + - BOUNCE + - SCRAWL + - PLUNGE + Rhyme Room (Circle): + entrances: + Rhyme Room (Looped Square): + room: Rhyme Room (Looped Square) + door: Door to Circle + Hidden Room: + room: Hidden Room + door: Rhyme Room Entrance + Rhyme Room (Smiley): + door: Door to Smiley + panels: + BIRD: + id: Double Room/Panel_word_rhyme + colors: purple + tag: whole rhyme + subtag: top + link: rhyme WORD + LETTER: + id: Double Room/Panel_word_whole + colors: blue + tag: whole rhyme + subtag: bot + link: rhyme WORD + FORBIDDEN: + id: Double Room/Panel_hidden_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme HIDDEN + CONCEALED: + id: Double Room/Panel_hidden_syn + tag: syn rhyme + subtag: bot + link: rhyme HIDDEN + VIOLENT: + id: Double Room/Panel_silent_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme SILENT + MUTE: + id: Double Room/Panel_silent_syn + tag: syn rhyme + subtag: bot + link: rhyme SILENT + doors: + Door to Smiley: + id: + - Double Room Area Doors/Door_room_2b + - Double Room Area Doors/Door_room_3b + location_name: Rhyme Room - Circle/Smiley Wall + group: Rhyme Room Doors + panels: + - BIRD + - LETTER + - VIOLENT + - MUTE + - room: Rhyme Room (Smiley) + panel: LOANS + - room: Rhyme Room (Smiley) + panel: SKELETON + - room: Rhyme Room (Smiley) + panel: REPENTANCE + - room: Rhyme Room (Smiley) + panel: WORD + paintings: + - id: arrows_painting_3 + orientation: north + Rhyme Room (Looped Square): + entrances: + Starting Room: + room: Starting Room + door: Rhyme Room Entrance + Rhyme Room (Circle): + door: Door to Circle + Rhyme Room (Cross): + door: Door to Cross + Rhyme Room (Target): + door: Door to Target + panels: + WALKED: + id: Double Room/Panel_blocked_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme BLOCKED + OBSTRUCTED: + id: Double Room/Panel_blocked_syn + tag: syn rhyme + subtag: bot + link: rhyme BLOCKED + SKIES: + id: Double Room/Panel_rise_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme RISE + SWELL: + id: Double Room/Panel_rise_syn + tag: syn rhyme + subtag: bot + link: rhyme RISE + PENNED: + id: Double Room/Panel_ascend_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme ASCEND + CLIMB: + id: Double Room/Panel_ascend_syn + tag: syn rhyme + subtag: bot + link: rhyme ASCEND + TROUBLE: + id: Double Room/Panel_double_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme DOUBLE + DUPLICATE: + id: Double Room/Panel_double_syn + tag: syn rhyme + subtag: bot + link: rhyme DOUBLE + doors: + Door to Circle: + id: + - Double Room Area Doors/Door_room_2a + - Double Room Area Doors/Door_room_1c + location_name: Rhyme Room - Circle/Looped Square Wall + group: Rhyme Room Doors + panels: + - WALKED + - OBSTRUCTED + - SKIES + - SWELL + - room: Rhyme Room (Circle) + panel: BIRD + - room: Rhyme Room (Circle) + panel: LETTER + - room: Rhyme Room (Circle) + panel: FORBIDDEN + - room: Rhyme Room (Circle) + panel: CONCEALED + Door to Cross: + id: + - Double Room Area Doors/Door_room_1a + - Double Room Area Doors/Door_room_5a + location_name: Rhyme Room - Cross/Looped Square Wall + group: Rhyme Room Doors + panels: + - SKIES + - SWELL + - PENNED + - CLIMB + - room: Rhyme Room (Cross) + panel: FERN + - room: Rhyme Room (Cross) + panel: STAY + - room: Rhyme Room (Cross) + panel: FRIEND + - room: Rhyme Room (Cross) + panel: RISE + Door to Target: + id: + - Double Room Area Doors/Door_room_1b + - Double Room Area Doors/Door_room_4b + location_name: Rhyme Room - Target/Looped Square Wall + group: Rhyme Room Doors + panels: + - PENNED + - CLIMB + - TROUBLE + - DUPLICATE + - room: Rhyme Room (Target) + panel: WILD + - room: Rhyme Room (Target) + panel: KID + - room: Rhyme Room (Target) + panel: PISTOL + - room: Rhyme Room (Target) + panel: QUARTZ + Rhyme Room (Target): + entrances: + Rhyme Room (Smiley): # one-way + room: Rhyme Room (Smiley) + door: Door to Target + Rhyme Room (Looped Square): + room: Rhyme Room (Looped Square) + door: Door to Target + panels: + WILD: + id: Double Room/Panel_child_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme CHILD + KID: + id: Double Room/Panel_child_syn + tag: syn rhyme + subtag: bot + link: rhyme CHILD + PISTOL: + id: Double Room/Panel_crystal_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme CRYSTAL + QUARTZ: + id: Double Room/Panel_crystal_syn + tag: syn rhyme + subtag: bot + link: rhyme CRYSTAL + INNOVATIVE (Top): + id: Double Room/Panel_creative_rhyme + colors: purple + tag: syn rhyme + subtag: top + link: rhyme CREATIVE + INNOVATIVE (Bottom): + id: Double Room/Panel_creative_syn + tag: syn rhyme + subtag: bot + link: rhyme CREATIVE + doors: + Door to Cross: + id: Double Room Area Doors/Door_room_4a + location_name: Rhyme Room (Target) - Puzzles Toward Cross + group: Rhyme Room Doors + panels: + - PISTOL + - QUARTZ + - INNOVATIVE (Top) + - INNOVATIVE (Bottom) + paintings: + - id: arrows_painting_4 + orientation: north + Room Room: + # This is a bit of a weird room. You can't really get to it from the roof. + # And even if you were to go through the shortcut on the fifth floor into + # the basement and up the stairs, you'd be blocked by the backsides of the + # ROOM panels, which isn't ideal. So we will, at least for now, say that + # this room is vanilla. + # + # For pretty much the same reason, I don't want to shuffle the paintings in + # here. + entrances: + Orange Tower Fourth Floor: True + panels: + DOOR (1): + id: Panel Room/Panel_room_door_1 + colors: gray + tag: forbid + DOOR (2): + id: Panel Room/Panel_room_door_2 + colors: gray + tag: forbid + WINDOW: + id: Panel Room/Panel_room_window_1 + colors: gray + tag: forbid + STAIRS: + id: Panel Room/Panel_room_stairs_1 + colors: gray + tag: forbid + PAINTING: + id: Panel Room/Panel_room_painting_1 + colors: gray + tag: forbid + FLOOR (1): + id: Panel Room/Panel_room_floor_1 + colors: gray + tag: forbid + FLOOR (2): + id: Panel Room/Panel_room_floor_2 + colors: gray + tag: forbid + FLOOR (3): + id: Panel Room/Panel_room_floor_3 + colors: gray + tag: forbid + FLOOR (4): + id: Panel Room/Panel_room_floor_4 + colors: gray + tag: forbid + FLOOR (5): + id: Panel Room/Panel_room_floor_5 + colors: gray + tag: forbid + FLOOR (7): + id: Panel Room/Panel_room_floor_7 + colors: gray + tag: forbid + FLOOR (8): + id: Panel Room/Panel_room_floor_8 + colors: gray + tag: forbid + FLOOR (9): + id: Panel Room/Panel_room_floor_9 + colors: gray + tag: forbid + FLOOR (10): + id: Panel Room/Panel_room_floor_10 + colors: gray + tag: forbid + CEILING (1): + id: Panel Room/Panel_room_ceiling_1 + colors: gray + tag: forbid + CEILING (2): + id: Panel Room/Panel_room_ceiling_2 + colors: gray + tag: forbid + CEILING (3): + id: Panel Room/Panel_room_ceiling_3 + colors: gray + tag: forbid + CEILING (4): + id: Panel Room/Panel_room_ceiling_4 + colors: gray + tag: forbid + CEILING (5): + id: Panel Room/Panel_room_ceiling_5 + colors: gray + tag: forbid + WALL (1): + id: Panel Room/Panel_room_wall_1 + colors: gray + tag: forbid + WALL (2): + id: Panel Room/Panel_room_wall_2 + colors: gray + tag: forbid + WALL (3): + id: Panel Room/Panel_room_wall_3 + colors: gray + tag: forbid + WALL (4): + id: Panel Room/Panel_room_wall_4 + colors: gray + tag: forbid + WALL (5): + id: Panel Room/Panel_room_wall_5 + colors: gray + tag: forbid + WALL (6): + id: Panel Room/Panel_room_wall_6 + colors: gray + tag: forbid + WALL (7): + id: Panel Room/Panel_room_wall_7 + colors: gray + tag: forbid + WALL (8): + id: Panel Room/Panel_room_wall_8 + colors: gray + tag: forbid + WALL (9): + id: Panel Room/Panel_room_wall_9 + colors: gray + tag: forbid + WALL (10): + id: Panel Room/Panel_room_wall_10 + colors: gray + tag: forbid + WALL (11): + id: Panel Room/Panel_room_wall_11 + colors: gray + tag: forbid + WALL (12): + id: Panel Room/Panel_room_wall_12 + colors: gray + tag: forbid + WALL (13): + id: Panel Room/Panel_room_wall_13 + colors: gray + tag: forbid + WALL (14): + id: Panel Room/Panel_room_wall_14 + colors: gray + tag: forbid + WALL (15): + id: Panel Room/Panel_room_wall_15 + colors: gray + tag: forbid + WALL (16): + id: Panel Room/Panel_room_wall_16 + colors: gray + tag: forbid + WALL (17): + id: Panel Room/Panel_room_wall_17 + colors: gray + tag: forbid + WALL (18): + id: Panel Room/Panel_room_wall_18 + colors: gray + tag: forbid + WALL (19): + id: Panel Room/Panel_room_wall_19 + colors: gray + tag: forbid + WALL (20): + id: Panel Room/Panel_room_wall_20 + colors: gray + tag: forbid + WALL (21): + id: Panel Room/Panel_room_wall_21 + colors: gray + tag: forbid + BROOMED: + id: Panel Room/Panel_broomed_bedroom + colors: yellow + tag: midyellow + required_door: + door: Excavation + LAYS: + id: Panel Room/Panel_lays_maze + colors: purple + tag: toppurp + required_panel: + panel: BROOMED + BASE: + id: Panel Room/Panel_base_basement + colors: blue + tag: midblue + required_panel: + panel: LAYS + MASTERY: + id: Master Room/Panel_mastery_mastery + tag: midwhite + colors: gray + required_door: + room: Orange Tower Seventh Floor + door: Mastery + doors: + Excavation: + event: True + panels: + - WALL (1) + Shortcut to Fifth Floor: + id: + - Tower Room Area Doors/Door_panel_basement + - Tower Room Area Doors/Door_panel_basement2 + panels: + - BASE + Cellar: + entrances: + Room Room: + room: Room Room + door: Excavation + Orange Tower Fifth Floor: + room: Room Room + door: Shortcut to Fifth Floor + Outside The Wise: + entrances: + Orange Tower Sixth Floor: + painting: True + Outside The Initiated: + painting: True + panels: + KITTEN: + id: Clock Room/Panel_kitten_cat + colors: brown + tag: botbrown + CAT: + id: Clock Room/Panel_cat_kitten + tag: bot brown black + colors: + - brown + - black + doors: + Wise Entrance: + id: Clock Room Area Doors/Door_time_start + item_name: The Wise - Entrance + panels: + - KITTEN + - CAT + paintings: + - id: arrows_painting_2 + orientation: east + - id: clock_painting_2 + orientation: east + exit_only: True + required: True + The Wise: + entrances: + Outside The Wise: + room: Outside The Wise + door: Wise Entrance + panels: + Achievement: + id: Countdown Panels/Panel_intelligent_wise + colors: + - brown + - black + tag: forbid + check: True + achievement: The Wise + PUPPY: + id: Clock Room/Panel_puppy_dog + colors: brown + tag: botbrown + ADULT: + id: Clock Room/Panel_adult_child + colors: + - brown + - black + tag: bot brown black + BREAD: + id: Clock Room/Panel_bread_mold + colors: brown + tag: botbrown + DINOSAUR: + id: Clock Room/Panel_dinosaur_fossil + colors: brown + tag: botbrown + OAK: + id: Clock Room/Panel_oak_acorn + colors: + - brown + - black + tag: bot brown black + CORPSE: + id: Clock Room/Panel_corpse_skeleton + colors: brown + tag: botbrown + BEFORE: + id: Clock Room/Panel_before_ere + colors: + - brown + - black + tag: mid brown black + YOUR: + id: Clock Room/Panel_your_thy + colors: + - brown + - black + tag: mid brown black + BETWIXT: + id: Clock Room/Panel_betwixt_between + colors: brown + tag: midbrown + NIGH: + id: Clock Room/Panel_nigh_near + colors: brown + tag: midbrown + CONNEXION: + id: Clock Room/Panel_connexion_connection + colors: brown + tag: midbrown + THOU: + id: Clock Room/Panel_thou_you + colors: brown + tag: midbrown + paintings: + - id: clock_painting_3 + orientation: east + req_blocked: True # outside the wise (with or without door shuffle) + The Red: + entrances: + Roof: True + panels: + Achievement: + id: Countdown Panels/Panel_grandfathered_red + colors: red + tag: forbid + check: True + achievement: The Red + PANDEMIC (1): + id: Hangry Room/Panel_red_top_1 + colors: red + tag: topred + TRINITY: + id: Hangry Room/Panel_red_top_2 + colors: red + tag: topred + CHEMISTRY: + id: Hangry Room/Panel_red_top_3 + colors: red + tag: topred + FLUMMOXED: + id: Hangry Room/Panel_red_top_4 + colors: red + tag: topred + PANDEMIC (2): + id: Hangry Room/Panel_red_mid_1 + colors: red + tag: midred + COUNTERCLOCKWISE: + id: Hangry Room/Panel_red_mid_2 + colors: red + tag: red top red mid black bot + FEARLESS: + id: Hangry Room/Panel_red_mid_3 + colors: red + tag: midred + DEFORESTATION: + id: Hangry Room/Panel_red_mid_4 + colors: red + tag: red mid bot + subtag: mid + link: rmb FORE + CRAFTSMANSHIP: + id: Hangry Room/Panel_red_mid_5 + colors: red + tag: red mid bot + subtag: mid + link: rmb AFT + CAMEL: + id: Hangry Room/Panel_red_bot_1 + colors: red + tag: botred + LION: + id: Hangry Room/Panel_red_bot_2 + colors: red + tag: botred + TIGER: + id: Hangry Room/Panel_red_bot_3 + colors: red + tag: botred + SHIP (1): + id: Hangry Room/Panel_red_bot_4 + colors: red + tag: red mid bot + subtag: bot + link: rmb FORE + SHIP (2): + id: Hangry Room/Panel_red_bot_5 + colors: red + tag: red mid bot + subtag: bot + link: rmb AFT + GIRAFFE: + id: Hangry Room/Panel_red_bot_6 + colors: red + tag: botred + The Ecstatic: + entrances: + Roof: True + panels: + Achievement: + id: Countdown Panels/Panel_ecstatic_ecstatic + colors: yellow + tag: forbid + check: True + achievement: The Ecstatic + FORM (1): + id: Smiley Room/Panel_soundgram_1 + colors: yellow + tag: yellow top bot + subtag: bottom + link: ytb FORM + WIND: + id: Smiley Room/Panel_soundgram_2 + colors: yellow + tag: botyellow + EGGS: + id: Smiley Room/Panel_scrambled_1 + colors: yellow + tag: botyellow + VEGETABLES: + id: Smiley Room/Panel_scrambled_2 + colors: yellow + tag: botyellow + WATER: + id: Smiley Room/Panel_anagram_6_1 + colors: yellow + tag: botyellow + FRUITS: + id: Smiley Room/Panel_anagram_6_2 + colors: yellow + tag: botyellow + LEAVES: + id: Smiley Room/Panel_anagram_7_1 + colors: yellow + tag: topyellow + VINES: + id: Smiley Room/Panel_anagram_7_2 + colors: yellow + tag: topyellow + ICE: + id: Smiley Room/Panel_anagram_7_3 + colors: yellow + tag: topyellow + STYLE: + id: Smiley Room/Panel_anagram_7_4 + colors: yellow + tag: topyellow + FIR: + id: Smiley Room/Panel_anagram_8_1 + colors: yellow + tag: topyellow + REEF: + id: Smiley Room/Panel_anagram_8_2 + colors: yellow + tag: topyellow + ROTS: + id: Smiley Room/Panel_anagram_8_3 + colors: yellow + tag: topyellow + FORM (2): + id: Smiley Room/Panel_anagram_9_1 + colors: yellow + tag: yellow top bot + subtag: top + link: ytb FORM + Outside The Scientific: + entrances: + Roof: True + The Scientific: + door: Scientific Entrance + panels: + OPEN: + id: Chemistry Room/Panel_open + tag: midwhite + CLOSE: + id: Chemistry Room/Panel_close + colors: black + tag: botblack + AHEAD: + id: Chemistry Room/Panel_ahead + colors: black + tag: botblack + doors: + Scientific Entrance: + id: Red Blue Purple Room Area Doors/Door_chemistry_lab + item_name: The Scientific - Entrance + panels: + - OPEN + The Scientific: + entrances: + Outside The Scientific: + room: Outside The Scientific + door: Scientific Entrance + panels: + Achievement: + id: Countdown Panels/Panel_scientific_scientific + colors: + - yellow + - red + - blue + - brown + - black + - purple + tag: forbid + check: True + achievement: The Scientific + HYDROGEN (1): + id: Chemistry Room/Panel_blue_bot_3 + colors: blue + tag: tri botblue + link: tbb WATER + OXYGEN: + id: Chemistry Room/Panel_blue_bot_2 + colors: blue + tag: tri botblue + link: tbb WATER + HYDROGEN (2): + id: Chemistry Room/Panel_blue_bot_4 + colors: blue + tag: tri botblue + link: tbb WATER + SUGAR (1): + id: Chemistry Room/Panel_sugar_1 + colors: red + tag: botred + SUGAR (2): + id: Chemistry Room/Panel_sugar_2 + colors: red + tag: botred + SUGAR (3): + id: Chemistry Room/Panel_sugar_3 + colors: red + tag: botred + CHLORINE: + id: Chemistry Room/Panel_blue_bot_5 + colors: blue + tag: double botblue + subtag: left + link: holo SALT + SODIUM: + id: Chemistry Room/Panel_blue_bot_6 + colors: blue + tag: double botblue + subtag: right + link: holo SALT + FOREST: + id: Chemistry Room/Panel_long_bot_1 + colors: + - red + - blue + tag: chain red bot blue top + POUND: + id: Chemistry Room/Panel_long_top_1 + colors: + - red + - blue + tag: chain blue mid red bot + ICE: + id: Chemistry Room/Panel_brown_bot_1 + colors: brown + tag: botbrown + FISSION: + id: Chemistry Room/Panel_black_bot_1 + colors: black + tag: botblack + FUSION: + id: Chemistry Room/Panel_black_bot_2 + colors: black + tag: botblack + MISS: + id: Chemistry Room/Panel_blue_top_1 + colors: blue + tag: double topblue + subtag: left + link: exp CHEMISTRY + TREE (1): + id: Chemistry Room/Panel_blue_top_2 + colors: blue + tag: double topblue + subtag: right + link: exp CHEMISTRY + BIOGRAPHY: + id: Chemistry Room/Panel_biology_9 + colors: purple + tag: midpurp + CACTUS: + id: Chemistry Room/Panel_biology_4 + colors: red + tag: double botred + subtag: right + link: mero SPINE + VERTEBRATE: + id: Chemistry Room/Panel_biology_8 + colors: red + tag: double botred + subtag: left + link: mero SPINE + ROSE: + id: Chemistry Room/Panel_biology_2 + colors: red + tag: botred + TREE (2): + id: Chemistry Room/Panel_biology_3 + colors: red + tag: botred + FRUIT: + id: Chemistry Room/Panel_biology_1 + colors: red + tag: botred + MAMMAL: + id: Chemistry Room/Panel_biology_5 + colors: red + tag: botred + BIRD: + id: Chemistry Room/Panel_biology_6 + colors: red + tag: botred + FISH: + id: Chemistry Room/Panel_biology_7 + colors: red + tag: botred + GRAVELY: + id: Chemistry Room/Panel_physics_9 + colors: purple + tag: double midpurp + subtag: left + link: change GRAVITY + BREVITY: + id: Chemistry Room/Panel_biology_10 + colors: purple + tag: double midpurp + subtag: right + link: change GRAVITY + PART: + id: Chemistry Room/Panel_physics_2 + colors: blue + tag: blue mid red bot + subtag: mid + link: xur PARTICLE + MATTER: + id: Chemistry Room/Panel_physics_1 + colors: red + tag: blue mid red bot + subtag: bot + link: xur PARTICLE + ELECTRIC: + id: Chemistry Room/Panel_physics_6 + colors: purple + tag: purple mid red bot + subtag: mid + link: xpr ELECTRON + ATOM (1): + id: Chemistry Room/Panel_physics_3 + colors: red + tag: purple mid red bot + subtag: bot + link: xpr ELECTRON + NEUTRAL: + id: Chemistry Room/Panel_physics_7 + colors: purple + tag: purple mid red bot + subtag: mid + link: xpr NEUTRON + ATOM (2): + id: Chemistry Room/Panel_physics_4 + colors: red + tag: purple mid red bot + subtag: bot + link: xpr NEUTRON + PROPEL: + id: Chemistry Room/Panel_physics_8 + colors: purple + tag: purple mid red bot + subtag: mid + link: xpr PROTON + ATOM (3): + id: Chemistry Room/Panel_physics_5 + colors: red + tag: purple mid red bot + subtag: bot + link: xpr PROTON + ORDER: + id: Chemistry Room/Panel_physics_11 + colors: brown + tag: botbrown + OPTICS: + id: Chemistry Room/Panel_physics_10 + colors: yellow + tag: midyellow + GRAPHITE: + id: Chemistry Room/Panel_yellow_bot_1 + colors: yellow + tag: botyellow + HOT RYE: + id: Chemistry Room/Panel_anagram_1 + colors: yellow + tag: midyellow + SIT SHY HOPE: + id: Chemistry Room/Panel_anagram_2 + colors: yellow + tag: midyellow + ME NEXT PIER: + id: Chemistry Room/Panel_anagram_3 + colors: yellow + tag: midyellow + RUT LESS: + id: Chemistry Room/Panel_anagram_4 + colors: yellow + tag: midyellow + SON COUNCIL: + id: Chemistry Room/Panel_anagram_5 + colors: yellow + tag: midyellow + doors: + Chemistry Puzzles: + skip_item: True + location_name: The Scientific - Chemistry Puzzles + panels: + - HYDROGEN (1) + - OXYGEN + - HYDROGEN (2) + - SUGAR (1) + - SUGAR (2) + - SUGAR (3) + - CHLORINE + - SODIUM + - FOREST + - POUND + - ICE + - FISSION + - FUSION + - MISS + - TREE (1) + Biology Puzzles: + skip_item: True + location_name: The Scientific - Biology Puzzles + panels: + - BIOGRAPHY + - CACTUS + - VERTEBRATE + - ROSE + - TREE (2) + - FRUIT + - MAMMAL + - BIRD + - FISH + Physics Puzzles: + skip_item: True + location_name: The Scientific - Physics Puzzles + panels: + - GRAVELY + - BREVITY + - PART + - MATTER + - ELECTRIC + - ATOM (1) + - NEUTRAL + - ATOM (2) + - PROPEL + - ATOM (3) + - ORDER + - OPTICS + paintings: + - id: hi_solved_painting4 + orientation: south + req_blocked_when_no_doors: True # owl hallway in vanilla doors + Challenge Room: + entrances: + Welcome Back Area: + door: Welcome Door + Number Hunt: + room: Outside The Undeterred + door: Challenge Entrance + panels: + WELCOME: + id: Challenge Room/Panel_welcome_welcome + tag: midwhite + CHALLENGE: + id: Challenge Room/Panel_challenge_challenge + tag: midwhite + Achievement: + id: Countdown Panels/Panel_challenged_unchallenged + check: True + colors: + - black + - gray + - red + - blue + - yellow + - purple + - brown + - orange + tag: forbid + achievement: The Unchallenged + OPEN: + id: Challenge Room/Panel_open_nepotism + colors: + - black + - blue + tag: chain mid black !!! blue + SINGED: + id: Challenge Room/Panel_singed_singsong + colors: + - red + - blue + tag: chain mid red blue + NEVER TRUSTED: + id: Challenge Room/Panel_nevertrusted_maladjusted + colors: purple + tag: midpurp + CORNER: + id: Challenge Room/Panel_corner_corn + colors: red + tag: midred + STRAWBERRIES: + id: Challenge Room/Panel_strawberries_mold + colors: brown + tag: double botbrown + subtag: left + link: time MOLD + GRUB: + id: Challenge Room/Panel_grub_burger + colors: + - black + - blue + tag: chain mid black blue + BREAD: + id: Challenge Room/Panel_bread_mold + colors: brown + tag: double botbrown + subtag: right + link: time MOLD + COLOR: + id: Challenge Room/Panel_color_gray + colors: gray + tag: forbid + WRITER: + id: Challenge Room/Panel_writer_songwriter + colors: blue + tag: midblue + "02759": + id: Challenge Room/Panel_tales_stale + colors: + - orange + - yellow + tag: chain mid orange yellow + REAL EYES: + id: Challenge Room/Panel_realeyes_realize + tag: topwhite + LOBS: + id: Challenge Room/Panel_lobs_lobster + colors: blue + tag: midblue + PEST ALLY: + id: Challenge Room/Panel_double_anagram_1 + colors: yellow + tag: midyellow + GENIAL HALO: + id: Challenge Room/Panel_double_anagram_2 + colors: yellow + tag: midyellow + DUCK LOGO: + id: Challenge Room/Panel_double_anagram_3 + colors: yellow + tag: midyellow + AVIAN GREEN: + id: Challenge Room/Panel_double_anagram_4 + colors: yellow + tag: midyellow + FEVER TEAR: + id: Challenge Room/Panel_double_anagram_5 + colors: yellow + tag: midyellow + FACTS: + id: Challenge Room/Panel_facts + colors: + - red + - blue + tag: forbid + FACTS (1): + id: Challenge Room/Panel_facts2 + colors: red + tag: forbid + FACTS (3): + id: Challenge Room/Panel_facts3 + tag: forbid + FACTS (4): + id: Challenge Room/Panel_facts4 + colors: blue + tag: forbid + FACTS (5): + id: Challenge Room/Panel_facts5 + colors: blue + tag: forbid + FACTS (6): + id: Challenge Room/Panel_facts6 + colors: blue + tag: forbid + LAPEL SHEEP: + id: Challenge Room/Panel_double_anagram_6 + colors: yellow + tag: midyellow + doors: + Welcome Door: + id: Entry Room Area Doors/Door_challenge_challenge + panels: + - WELCOME diff --git a/worlds/lingo/__init__.py b/worlds/lingo/__init__.py new file mode 100644 index 000000000000..1f426c92f24a --- /dev/null +++ b/worlds/lingo/__init__.py @@ -0,0 +1,112 @@ +""" +Archipelago init file for Lingo +""" +from BaseClasses import Item, Tutorial +from worlds.AutoWorld import WebWorld, World +from .items import ALL_ITEM_TABLE, LingoItem +from .locations import ALL_LOCATION_TABLE +from .options import LingoOptions +from .player_logic import LingoPlayerLogic +from .regions import create_regions +from .static_logic import Room, RoomEntrance +from .testing import LingoTestOptions + + +class LingoWebWorld(WebWorld): + theme = "grass" + tutorials = [Tutorial( + "Multiworld Setup Guide", + "A guide to playing Lingo with Archipelago.", + "English", + "setup_en.md", + "setup/en", + ["hatkirby"] + )] + + +class LingoWorld(World): + """ + Lingo is a first person indie puzzle game in the vein of The Witness. You find yourself in a mazelike, non-Euclidean + world filled with 800 word puzzles that use a variety of different mechanics. + """ + game = "Lingo" + web = LingoWebWorld() + + base_id = 444400 + topology_present = True + data_version = 1 + + options_dataclass = LingoOptions + options: LingoOptions + + item_name_to_id = { + name: data.code for name, data in ALL_ITEM_TABLE.items() + } + location_name_to_id = { + name: data.code for name, data in ALL_LOCATION_TABLE.items() + } + + player_logic: LingoPlayerLogic + + def generate_early(self): + self.player_logic = LingoPlayerLogic(self) + + def create_regions(self): + create_regions(self, self.player_logic) + + def create_items(self): + pool = [self.create_item(name) for name in self.player_logic.REAL_ITEMS] + + if self.player_logic.FORCED_GOOD_ITEM != "": + new_item = self.create_item(self.player_logic.FORCED_GOOD_ITEM) + location_obj = self.multiworld.get_location("Second Room - Good Luck", self.player) + location_obj.place_locked_item(new_item) + + item_difference = len(self.player_logic.REAL_LOCATIONS) - len(pool) + if item_difference: + trap_percentage = self.options.trap_percentage + traps = int(item_difference * trap_percentage / 100.0) + non_traps = item_difference - traps + + if non_traps: + skip_percentage = self.options.puzzle_skip_percentage + skips = int(non_traps * skip_percentage / 100.0) + non_skips = non_traps - skips + + filler_list = [":)", "The Feeling of Being Lost", "Wanderlust", "Empty White Hallways"] + for i in range(0, non_skips): + pool.append(self.create_item(filler_list[i % len(filler_list)])) + + for i in range(0, skips): + pool.append(self.create_item("Puzzle Skip")) + + if traps: + traps_list = ["Slowness Trap", "Iceland Trap", "Atbash Trap"] + + for i in range(0, traps): + pool.append(self.create_item(traps_list[i % len(traps_list)])) + + self.multiworld.itempool += pool + + def create_item(self, name: str) -> Item: + item = ALL_ITEM_TABLE[name] + return LingoItem(name, item.classification, item.code, self.player) + + def set_rules(self): + self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) + + def fill_slot_data(self): + slot_options = [ + "death_link", "victory_condition", "shuffle_colors", "shuffle_doors", "shuffle_paintings", "shuffle_panels", + "mastery_achievements", "level_2_requirement", "location_checks", "early_color_hallways" + ] + + slot_data = { + "seed": self.random.randint(0, 1000000), + **self.options.as_dict(*slot_options), + } + + if self.options.shuffle_paintings: + slot_data["painting_entrance_to_exit"] = self.player_logic.PAINTING_MAPPING + + return slot_data diff --git a/worlds/lingo/docs/en_Lingo.md b/worlds/lingo/docs/en_Lingo.md new file mode 100644 index 000000000000..cff0581d9b2f --- /dev/null +++ b/worlds/lingo/docs/en_Lingo.md @@ -0,0 +1,42 @@ +# Lingo + +## Where is the settings page? + +The [player settings page for this game](../player-settings) contains all the options you need to configure and export a +config file. + +## What does randomization do to this game? + +There are a couple of modes of randomization currently available, and you can pick and choose which ones you would like +to use. + +* **Door shuffle**: There are many doors in the game, which are opened by completing a set of panels. With door shuffle + on, the doors become items and only open up once you receive the corresponding item. The panel sets that would + ordinarily open the doors become locations. + +* **Color shuffle**: There are ten different colors of puzzle in the game, each representing a different mechanic. With + color shuffle on, you would start with only access to white puzzles. Puzzles of other colors will require you to + receive an item in order to solve them (e.g. you can't solve any red puzzles until you receive the "Red" item). + +* **Panel shuffle**: Panel shuffling replaces the puzzles on each panel with different ones. So far, the only mode of + panel shuffling is "rearrange" mode, which simply shuffles the already-existing puzzles from the base game onto + different panels. + +* **Painting shuffle**: This randomizes the appearance of the paintings in the game, as well as which of them are warps, + and the locations that they warp you to. It is the equivalent of an entrance randomizer in another game. + +## What is a "check" in this game? + +Most panels / panel sets that open a door are now location checks, even if door shuffle is not enabled. Various other +puzzles are also location checks, including the achievement panels for each area. + +## What about wall snipes? + +"Wall sniping" refers to the fact that you are able to solve puzzles on the other side of opaque walls. This randomizer +does not change how wall snipes work, but it will never require the use of them. There are three puzzles from the base +game that you would ordinarily be expected to wall snipe. The randomizer moves these panels out of the wall or otherwise +reveals them so that a snipe is not necessary. + +Because of this, all wall snipes are considered out of logic. This includes sniping The Bearer's MIDDLE while standing +outside The Bold, sniping The Colorful without opening all of the color doors, and sniping WELCOME from next to WELCOME +BACK. diff --git a/worlds/lingo/docs/setup_en.md b/worlds/lingo/docs/setup_en.md new file mode 100644 index 000000000000..97f3ce594063 --- /dev/null +++ b/worlds/lingo/docs/setup_en.md @@ -0,0 +1,45 @@ +# Lingo Randomizer Setup + +## Required Software + +- [Lingo](https://store.steampowered.com/app/1814170/Lingo/) +- [Lingo Archipelago Randomizer](https://code.fourisland.com/lingo-archipelago/about/CHANGELOG.md) + +## Optional Software + +- [Archipelago Text Client](https://github.com/ArchipelagoMW/Archipelago/releases) +- [Lingo AP Tracker](https://code.fourisland.com/lingo-ap-tracker/about/CHANGELOG.md) + +## Installation + +1. Download the Lingo Archipelago Randomizer from the above link. +2. Open up Lingo, go to settings, and click View Game Data. This should open up + a folder in Windows Explorer. +3. Unzip the contents of the randomizer into the "maps" folder. You may need to + create the "maps" folder if you have not played a custom Lingo map before. +4. Installation complete! You may have to click Return to go back to the main + menu and then click Settings again in order to get the randomizer to show up + in the level selection list. + +## Joining a Multiworld game + +1. Launch Lingo +2. Click on Settings, and then Level. Choose Archipelago from the list. +3. Start a new game. Leave the name field blank (anything you type in will be + ignored). +4. Enter the Archipelago address, slot name, and password into the fields. +5. Press Connect. +6. Enjoy! + +To continue an earlier game, you can perform the exact same steps as above. You +do not have to re-select Archipelago in the level selection screen if you were +using Archipelago the last time you launched the game. + +In order to play the base game again, simply return to the level selection +screen and choose Level 1 (or whatever else you want to play). The randomizer +will not affect gameplay unless you launch it by starting a new game while it is +selected in the level selection screen, so it is safe to play the game normally +while the client is installed. + +**Note**: Running the randomizer modifies the game's memory. If you want to play +the base game after playing the randomizer, you need to restart Lingo first. diff --git a/worlds/lingo/ids.yaml b/worlds/lingo/ids.yaml new file mode 100644 index 000000000000..1a1ceca24adc --- /dev/null +++ b/worlds/lingo/ids.yaml @@ -0,0 +1,1451 @@ +--- +special_items: + Black: 444400 + Red: 444401 + Blue: 444402 + Yellow: 444403 + Green: 444404 + Orange: 444405 + Gray: 444406 + Brown: 444407 + Purple: 444408 + ":)": 444409 + The Feeling of Being Lost: 444575 + Wanderlust: 444576 + Empty White Hallways: 444577 + Slowness Trap: 444410 + Iceland Trap: 444411 + Atbash Trap: 444412 + Puzzle Skip: 444413 +panels: + Starting Room: + HI: 444400 + HIDDEN: 444401 + TYPE: 444402 + THIS: 444403 + WRITE: 444404 + SAME: 444405 + Hidden Room: + DEAD END: 444406 + OPEN: 444407 + LIES: 444408 + The Seeker: + Achievement: 444409 + BEAR: 444410 + MINE: 444411 + MINE (2): 444412 + BOW: 444413 + DOES: 444414 + MOBILE: 444415 + MOBILE (2): 444416 + DESERT: 444417 + DESSERT: 444418 + SOW: 444419 + SEW: 444420 + TO: 444421 + TOO: 444422 + WRITE: 444423 + EWE: 444424 + KNOT: 444425 + NAUGHT: 444426 + BEAR (2): 444427 + Second Room: + HI: 444428 + LOW: 444429 + ANOTHER TRY: 444430 + LEVEL 2: 444431 + Hub Room: + ORDER: 444432 + SLAUGHTER: 444433 + NEAR: 444434 + FAR: 444435 + TRACE: 444436 + RAT: 444437 + OPEN: 444438 + FOUR: 444439 + LOST: 444440 + FORWARD: 444441 + BETWEEN: 444442 + BACKWARD: 444443 + Dead End Area: + FOUR: 444444 + EIGHT: 444445 + Pilgrim Antechamber: + HOT CRUST: 444446 + PILGRIMAGE: 444447 + MASTERY: 444448 + Pilgrim Room: + THIS: 444449 + TIME ROOM: 444450 + SCIENCE ROOM: 444451 + SHINY ROCK ROOM: 444452 + ANGRY POWER: 444453 + MICRO LEGION: 444454 + LOSERS RELAX: 444455 + '906234': 444456 + MOOR EMORDNILAP: 444457 + HALL ROOMMATE: 444458 + ALL GREY: 444459 + PLUNDER ISLAND: 444460 + FLOSS PATHS: 444461 + Crossroads: + DECAY: 444462 + NOPE: 444463 + EIGHT: 444464 + WE ROT: 444465 + WORDS: 444466 + SWORD: 444467 + TURN: 444468 + BEND HI: 444469 + THE EYES: 444470 + CORNER: 444471 + HOLLOW: 444472 + SWAP: 444473 + GEL: 444474 + THOUGH: 444475 + CROSSROADS: 444476 + Lost Area: + LOST (1): 444477 + LOST (2): 444478 + Amen Name Area: + AMEN: 444479 + NAME: 444480 + NINE: 444481 + Suits Area: + SPADES: 444482 + CLUBS: 444483 + HEARTS: 444484 + The Tenacious: + LEVEL (Black): 444485 + RACECAR (Black): 444486 + SOLOS (Black): 444487 + LEVEL (White): 444488 + RACECAR (White): 444489 + SOLOS (White): 444490 + Achievement: 444491 + Warts Straw Area: + WARTS: 444492 + STRAW: 444493 + Leaf Feel Area: + LEAF: 444494 + FEEL: 444495 + Outside The Agreeable: + MASSACRED: 444496 + BLACK: 444497 + CLOSE: 444498 + LEFT: 444499 + LEFT (2): 444500 + RIGHT: 444501 + PURPLE: 444502 + FIVE (1): 444503 + FIVE (2): 444504 + OUT: 444505 + HIDE: 444506 + DAZE: 444507 + WALL: 444508 + KEEP: 444509 + BAILEY: 444510 + TOWER: 444511 + NORTH: 444512 + DIAMONDS: 444513 + FIRE: 444514 + WINTER: 444515 + Dread Hallway: + DREAD: 444516 + The Agreeable: + Achievement: 444517 + BYE: 444518 + RETOOL: 444519 + DRAWER: 444520 + READ: 444521 + DIFFERENT: 444522 + LOW: 444523 + ALIVE: 444524 + THAT: 444525 + STRESSED: 444526 + STAR: 444527 + TAME: 444528 + CAT: 444529 + Hedge Maze: + DOWN: 444530 + HIDE (1): 444531 + HIDE (2): 444532 + HIDE (3): 444533 + MASTERY (1): 444534 + MASTERY (2): 444535 + PATH (1): 444536 + PATH (2): 444537 + PATH (3): 444538 + PATH (4): 444539 + PATH (5): 444540 + PATH (6): 444541 + PATH (7): 444542 + PATH (8): 444543 + REFLOW: 444544 + LEAP: 444545 + The Perceptive: + Achievement: 444546 + GAZE: 444547 + The Fearless (First Floor): + NAPS: 444548 + TEAM: 444549 + TEEM: 444550 + IMPATIENT: 444551 + EAT: 444552 + The Fearless (Second Floor): + NONE: 444553 + SUM: 444554 + FUNNY: 444555 + MIGHT: 444556 + SAFE: 444557 + SAME: 444558 + CAME: 444559 + The Fearless: + Achievement: 444560 + EASY: 444561 + SOMETIMES: 444562 + DARK: 444563 + EVEN: 444564 + The Observant: + Achievement: 444565 + BACK: 444566 + SIDE: 444567 + BACKSIDE: 444568 + STAIRS: 444569 + WAYS: 444570 + 'ON': 444571 + UP: 444572 + SWIMS: 444573 + UPSTAIRS: 444574 + TOIL: 444575 + STOP: 444576 + TOP: 444577 + HI: 444578 + HI (2): 444579 + '31': 444580 + '52': 444581 + OIL: 444582 + BACKSIDE (GREEN): 444583 + SIDEWAYS: 444584 + The Incomparable: + Achievement: 444585 + A (One): 444586 + A (Two): 444587 + A (Three): 444588 + A (Four): 444589 + A (Five): 444590 + A (Six): 444591 + I (One): 444592 + I (Two): 444593 + I (Three): 444594 + I (Four): 444595 + I (Five): 444596 + I (Six): 444597 + I (Seven): 444598 + Eight Room: + Eight Back: 444599 + Eight Front: 444600 + Nine: 444601 + Orange Tower First Floor: + SECRET: 444602 + DADS + ALE: 444603 + SALT: 444604 + Orange Tower Third Floor: + RED: 444605 + DEER + WREN: 444606 + Orange Tower Fourth Floor: + RUNT: 444607 + RUNT (2): 444608 + LEARNS + UNSEW: 444609 + HOT CRUSTS: 444610 + IRK HORN: 444611 + Hot Crusts Area: + EIGHT: 444612 + Orange Tower Fifth Floor: + SIZE (Small): 444613 + SIZE (Big): 444614 + DRAWL + RUNS: 444615 + NINE: 444616 + SUMMER: 444617 + AUTUMN: 444618 + SPRING: 444619 + PAINTING (1): 445078 + PAINTING (2): 445079 + PAINTING (3): 445080 + PAINTING (4): 445081 + PAINTING (5): 445082 + ROOM: 445083 + Orange Tower Seventh Floor: + THE END: 444620 + THE MASTER: 444621 + MASTERY: 444622 + Roof: + MASTERY (1): 444623 + MASTERY (2): 444624 + MASTERY (3): 444625 + MASTERY (4): 444626 + MASTERY (5): 444627 + MASTERY (6): 444628 + STAIRCASE: 444629 + Orange Tower Basement: + MASTERY: 444630 + THE LIBRARY: 444631 + Courtyard: + I: 444632 + GREEN: 444633 + PINECONE: 444634 + ACORN: 444635 + Yellow Backside Area: + BACKSIDE: 444636 + NINE: 444637 + First Second Third Fourth: + FIRST: 444638 + SECOND: 444639 + THIRD: 444640 + FOURTH: 444641 + The Colorful (White): + BEGIN: 444642 + The Colorful (Black): + FOUND: 444643 + The Colorful (Red): + LOAF: 444644 + The Colorful (Yellow): + CREAM: 444645 + The Colorful (Blue): + SUN: 444646 + The Colorful (Purple): + SPOON: 444647 + The Colorful (Orange): + LETTERS: 444648 + The Colorful (Green): + WALLS: 444649 + The Colorful (Brown): + IRON: 444650 + The Colorful (Gray): + OBSTACLE: 444651 + The Colorful: + Achievement: 444652 + Welcome Back Area: + WELCOME BACK: 444653 + SECRET: 444654 + CLOCKWISE: 444655 + Owl Hallway: + STRAYS: 444656 + READS + RUST: 444657 + Outside The Initiated: + SEVEN (1): 444658 + SEVEN (2): 444659 + EIGHT: 444660 + NINE: 444661 + BLUE: 444662 + ORANGE: 444663 + UNCOVER: 444664 + OXEN: 444665 + BACKSIDE: 444666 + The Optimistic: 444667 + PAST: 444668 + FUTURE: 444669 + FUTURE (2): 444670 + PAST (2): 444671 + PRESENT: 444672 + SMILE: 444673 + ANGERED: 444674 + VOTE: 444675 + The Initiated: + Achievement: 444676 + DAUGHTER: 444677 + START: 444678 + STARE: 444679 + HYPE: 444680 + ABYSS: 444681 + SWEAT: 444682 + BEAT: 444683 + ALUMNI: 444684 + PATS: 444685 + KNIGHT: 444686 + BYTE: 444687 + MAIM: 444688 + MORGUE: 444689 + CHAIR: 444690 + HUMAN: 444691 + BED: 444692 + The Traveled: + Achievement: 444693 + CLOSE: 444694 + COMPOSE: 444695 + RECORD: 444696 + CATEGORY: 444697 + HELLO: 444698 + DUPLICATE: 444699 + IDENTICAL: 444700 + DISTANT: 444701 + HAY: 444702 + GIGGLE: 444703 + CHUCKLE: 444704 + SNITCH: 444705 + CONCEALED: 444706 + PLUNGE: 444707 + AUTUMN: 444708 + ROAD: 444709 + FOUR: 444710 + Outside The Bold: + UNOPEN: 444711 + BEGIN: 444712 + SIX: 444713 + NINE: 444714 + LEFT: 444715 + RIGHT: 444716 + RISE (Horizon): 444717 + RISE (Sunrise): 444718 + ZEN: 444719 + SON: 444720 + STARGAZER: 444721 + MOUTH: 444722 + YEAST: 444723 + WET: 444724 + The Bold: + Achievement: 444725 + FOOT: 444726 + NEEDLE: 444727 + FACE: 444728 + SIGN: 444729 + HEARTBREAK: 444730 + UNDEAD: 444731 + DEADLINE: 444732 + SUSHI: 444733 + THISTLE: 444734 + LANDMASS: 444735 + MASSACRED: 444736 + AIRPLANE: 444737 + NIGHTMARE: 444738 + MOUTH: 444739 + SAW: 444740 + HAND: 444741 + Outside The Undeterred: + HOLLOW: 444742 + ART + ART: 444743 + PEN: 444744 + HUSTLING: 444745 + SUNLIGHT: 444746 + LIGHT: 444747 + BRIGHT: 444748 + SUNNY: 444749 + RAINY: 444750 + ZERO: 444751 + ONE: 444752 + TWO (1): 444753 + TWO (2): 444754 + THREE (1): 444755 + THREE (2): 444756 + THREE (3): 444757 + FOUR: 444758 + The Undeterred: + Achievement: 444759 + BONE: 444760 + EYE: 444761 + MOUTH: 444762 + IRIS: 444763 + EYE (2): 444764 + ICE: 444765 + HEIGHT: 444766 + EYE (3): 444767 + NOT: 444768 + JUST: 444769 + READ: 444770 + FATHER: 444771 + FEATHER: 444772 + CONTINENT: 444773 + OCEAN: 444774 + WALL: 444775 + Number Hunt: + FIVE: 444776 + SIX: 444777 + SEVEN: 444778 + EIGHT: 444779 + NINE: 444780 + Directional Gallery: + PEPPER: 444781 + TURN: 444782 + LEARN: 444783 + FIVE (1): 444784 + FIVE (2): 444785 + SIX (1): 444786 + SIX (2): 444787 + SEVEN: 444788 + EIGHT: 444789 + NINE: 444790 + BACKSIDE: 444791 + '834283054': 444792 + PARANOID: 444793 + YELLOW: 444794 + WADED + WEE: 444795 + THE EYES: 444796 + LEFT: 444797 + RIGHT: 444798 + MIDDLE: 444799 + WARD: 444800 + HIND: 444801 + RIG: 444802 + WINDWARD: 444803 + LIGHT: 444804 + REWIND: 444805 + Champion's Rest: + EXIT: 444806 + HUES: 444807 + RED: 444808 + BLUE: 444809 + YELLOW: 444810 + GREEN: 444811 + PURPLE: 444812 + ORANGE: 444813 + YOU: 444814 + ME: 444815 + SECRET BLUE: 444816 + SECRET YELLOW: 444817 + SECRET RED: 444818 + The Bearer: + Achievement: 444819 + MIDDLE: 444820 + FARTHER: 444821 + BACKSIDE: 444822 + PART: 444823 + HEART: 444824 + The Bearer (East): + SIX: 444825 + PEACE: 444826 + The Bearer (North): + SILENT (1): 444827 + SILENT (2): 444828 + SPACE: 444829 + WARTS: 444830 + The Bearer (South): + SIX: 444831 + TENT: 444832 + BOWL: 444833 + The Bearer (West): + SNOW: 444834 + SMILE: 444835 + Bearer Side Area: + SHORTCUT: 444836 + POTS: 444837 + Cross Tower (East): + WINTER: 444838 + Cross Tower (North): + NORTH: 444839 + Cross Tower (South): + FIRE: 444840 + Cross Tower (West): + DIAMONDS: 444841 + The Steady (Rose): + SOAR: 444842 + The Steady (Ruby): + BURY: 444843 + The Steady (Carnation): + INCARNATION: 444844 + The Steady (Sunflower): + SUN: 444845 + The Steady (Plum): + LUMP: 444846 + The Steady (Lime): + LIMELIGHT: 444847 + The Steady (Lemon): + MELON: 444848 + The Steady (Topaz): + TOP: 444849 + MASTERY: 444850 + The Steady (Orange): + BLUE: 444851 + The Steady (Sapphire): + SAP: 444852 + The Steady (Blueberry): + BLUE: 444853 + The Steady (Amber): + ANTECHAMBER: 444854 + The Steady (Emerald): + HERALD: 444855 + The Steady (Amethyst): + PACIFIST: 444856 + The Steady (Lilac): + LIE LACK: 444857 + The Steady (Cherry): + HAIRY: 444858 + The Steady: + Achievement: 444859 + Knight Night (Outer Ring): + NIGHT: 444860 + KNIGHT: 444861 + BEE: 444862 + NEW: 444863 + FORE: 444864 + TRUSTED (1): 444865 + TRUSTED (2): 444866 + ENCRUSTED: 444867 + ADJUST (1): 444868 + ADJUST (2): 444869 + RIGHT: 444870 + TRUST: 444871 + Knight Night (Right Upper Segment): + RUST (1): 444872 + RUST (2): 444873 + Knight Night (Right Lower Segment): + ADJUST: 444874 + BEFORE: 444875 + BE: 444876 + LEFT: 444877 + TRUST: 444878 + Knight Night (Final): + TRUSTED: 444879 + Knight Night Exit: + SEVEN (1): 444880 + SEVEN (2): 444881 + SEVEN (3): 444882 + DEAD END: 444883 + WARNER: 444884 + The Artistic (Smiley): + Achievement: 444885 + FINE: 444886 + BLADE: 444887 + RED: 444888 + BEARD: 444889 + ICE: 444890 + ROOT: 444891 + The Artistic (Panda): + EYE (Top): 444892 + EYE (Bottom): 444893 + LADYLIKE: 444894 + WATER: 444895 + OURS: 444896 + DAYS: 444897 + NIGHTTIME: 444898 + NIGHT: 444899 + The Artistic (Lattice): + POSH: 444900 + MALL: 444901 + DEICIDE: 444902 + WAVER: 444903 + REPAID: 444904 + BABY: 444905 + LOBE: 444906 + BOWELS: 444907 + The Artistic (Apple): + SPRIG: 444908 + RELEASES: 444909 + MUCH: 444910 + FISH: 444911 + MASK: 444912 + HILL: 444913 + TINE: 444914 + THING: 444915 + The Artistic (Hint Room): + THEME: 444916 + PAINTS: 444917 + I: 444918 + KIT: 444919 + The Discerning: + Achievement: 444920 + HITS: 444921 + WARRED: 444922 + REDRAW: 444923 + ADDER: 444924 + LAUGHTERS: 444925 + STONE: 444926 + ONSET: 444927 + RAT: 444928 + DUSTY: 444929 + ARTS: 444930 + TSAR: 444931 + STATE: 444932 + REACT: 444933 + DEAR: 444934 + DARE: 444935 + SEAM: 444936 + The Eyes They See: + NEAR: 444937 + EIGHT: 444938 + Far Window: + FAR: 444939 + Outside The Wondrous: + SHRINK: 444940 + The Wondrous (Bookcase): + CASE: 444941 + The Wondrous (Chandelier): + CANDLE HEIR: 444942 + The Wondrous (Window): + GLASS: 444943 + The Wondrous (Table): + WOOD: 444944 + BROOK NOD: 444945 + The Wondrous: + FIREPLACE: 444946 + Achievement: 444947 + Arrow Garden: + MASTERY: 444948 + SHARP: 444949 + Hallway Room (2): + WISE: 444950 + CLOCK: 444951 + ER: 444952 + COUNT: 444953 + Hallway Room (3): + TRANCE: 444954 + FORM: 444955 + A: 444956 + SHUN: 444957 + Hallway Room (4): + WHEEL: 444958 + Elements Area: + A: 444959 + NINE: 444960 + UNDISTRACTED: 444961 + MASTERY: 444962 + EARTH: 444963 + WATER: 444964 + AIR: 444965 + Outside The Wanderer: + WANDERLUST: 444966 + The Wanderer: + Achievement: 444967 + '7890': 444968 + '6524': 444969 + '951': 444970 + '4524': 444971 + LEARN: 444972 + DUST: 444973 + STAR: 444974 + WANDER: 444975 + Art Gallery: + EIGHT: 444976 + EON: 444977 + TRUSTWORTHY: 444978 + FREE: 444979 + OUR: 444980 + ONE ROAD MANY TURNS: 444981 + Art Gallery (Second Floor): + HOUSE: 444982 + PATH: 444983 + PARK: 444984 + CARRIAGE: 444985 + Art Gallery (Third Floor): + AN: 444986 + MAY: 444987 + ANY: 444988 + MAN: 444989 + Art Gallery (Fourth Floor): + URNS: 444990 + LEARNS: 444991 + RUNTS: 444992 + SEND - USE: 444993 + TRUST: 444994 + '062459': 444995 + Rhyme Room (Smiley): + LOANS: 444996 + SKELETON: 444997 + REPENTANCE: 444998 + WORD: 444999 + SCHEME: 445000 + FANTASY: 445001 + HISTORY: 445002 + SECRET: 445003 + Rhyme Room (Cross): + NINE: 445004 + FERN: 445005 + STAY: 445006 + FRIEND: 445007 + RISE: 445008 + PLUMP: 445009 + BOUNCE: 445010 + SCRAWL: 445011 + PLUNGE: 445012 + LEAP: 445013 + Rhyme Room (Circle): + BIRD: 445014 + LETTER: 445015 + FORBIDDEN: 445016 + CONCEALED: 445017 + VIOLENT: 445018 + MUTE: 445019 + Rhyme Room (Looped Square): + WALKED: 445020 + OBSTRUCTED: 445021 + SKIES: 445022 + SWELL: 445023 + PENNED: 445024 + CLIMB: 445025 + TROUBLE: 445026 + DUPLICATE: 445027 + Rhyme Room (Target): + WILD: 445028 + KID: 445029 + PISTOL: 445030 + QUARTZ: 445031 + INNOVATIVE (Top): 445032 + INNOVATIVE (Bottom): 445033 + Room Room: + DOOR (1): 445034 + DOOR (2): 445035 + WINDOW: 445036 + STAIRS: 445037 + PAINTING: 445038 + FLOOR (1): 445039 + FLOOR (2): 445040 + FLOOR (3): 445041 + FLOOR (4): 445042 + FLOOR (5): 445043 + FLOOR (7): 445044 + FLOOR (8): 445045 + FLOOR (9): 445046 + FLOOR (10): 445047 + CEILING (1): 445048 + CEILING (2): 445049 + CEILING (3): 445050 + CEILING (4): 445051 + CEILING (5): 445052 + WALL (1): 445053 + WALL (2): 445054 + WALL (3): 445055 + WALL (4): 445056 + WALL (5): 445057 + WALL (6): 445058 + WALL (7): 445059 + WALL (8): 445060 + WALL (9): 445061 + WALL (10): 445062 + WALL (11): 445063 + WALL (12): 445064 + WALL (13): 445065 + WALL (14): 445066 + WALL (15): 445067 + WALL (16): 445068 + WALL (17): 445069 + WALL (18): 445070 + WALL (19): 445071 + WALL (20): 445072 + WALL (21): 445073 + BROOMED: 445074 + LAYS: 445075 + BASE: 445076 + MASTERY: 445077 + Outside The Wise: + KITTEN: 445084 + CAT: 445085 + The Wise: + Achievement: 445086 + PUPPY: 445087 + ADULT: 445088 + BREAD: 445089 + DINOSAUR: 445090 + OAK: 445091 + CORPSE: 445092 + BEFORE: 445093 + YOUR: 445094 + BETWIXT: 445095 + NIGH: 445096 + CONNEXION: 445097 + THOU: 445098 + The Red: + Achievement: 445099 + PANDEMIC (1): 445100 + TRINITY: 445101 + CHEMISTRY: 445102 + FLUMMOXED: 445103 + PANDEMIC (2): 445104 + COUNTERCLOCKWISE: 445105 + FEARLESS: 445106 + DEFORESTATION: 445107 + CRAFTSMANSHIP: 445108 + CAMEL: 445109 + LION: 445110 + TIGER: 445111 + SHIP (1): 445112 + SHIP (2): 445113 + GIRAFFE: 445114 + The Ecstatic: + Achievement: 445115 + FORM (1): 445116 + WIND: 445117 + EGGS: 445118 + VEGETABLES: 445119 + WATER: 445120 + FRUITS: 445121 + LEAVES: 445122 + VINES: 445123 + ICE: 445124 + STYLE: 445125 + FIR: 445126 + REEF: 445127 + ROTS: 445128 + FORM (2): 445129 + Outside The Scientific: + OPEN: 445130 + CLOSE: 445131 + AHEAD: 445132 + The Scientific: + Achievement: 445133 + HYDROGEN (1): 445134 + OXYGEN: 445135 + HYDROGEN (2): 445136 + SUGAR (1): 445137 + SUGAR (2): 445138 + SUGAR (3): 445139 + CHLORINE: 445140 + SODIUM: 445141 + FOREST: 445142 + POUND: 445143 + ICE: 445144 + FISSION: 445145 + FUSION: 445146 + MISS: 445147 + TREE (1): 445148 + BIOGRAPHY: 445149 + CACTUS: 445150 + VERTEBRATE: 445151 + ROSE: 445152 + TREE (2): 445153 + FRUIT: 445154 + MAMMAL: 445155 + BIRD: 445156 + FISH: 445157 + GRAVELY: 445158 + BREVITY: 445159 + PART: 445160 + MATTER: 445161 + ELECTRIC: 445162 + ATOM (1): 445163 + NEUTRAL: 445164 + ATOM (2): 445165 + PROPEL: 445166 + ATOM (3): 445167 + ORDER: 445168 + OPTICS: 445169 + GRAPHITE: 445170 + HOT RYE: 445171 + SIT SHY HOPE: 445172 + ME NEXT PIER: 445173 + RUT LESS: 445174 + SON COUNCIL: 445175 + Challenge Room: + WELCOME: 445176 + CHALLENGE: 445177 + Achievement: 445178 + OPEN: 445179 + SINGED: 445180 + NEVER TRUSTED: 445181 + CORNER: 445182 + STRAWBERRIES: 445183 + GRUB: 445184 + BREAD: 445185 + COLOR: 445186 + WRITER: 445187 + '02759': 445188 + REAL EYES: 445189 + LOBS: 445190 + PEST ALLY: 445191 + GENIAL HALO: 445192 + DUCK LOGO: 445193 + AVIAN GREEN: 445194 + FEVER TEAR: 445195 + FACTS: 445196 + FACTS (1): 445197 + FACTS (3): 445198 + FACTS (4): 445199 + FACTS (5): 445200 + FACTS (6): 445201 + LAPEL SHEEP: 445202 +doors: + Starting Room: + Back Right Door: + item: 444416 + location: 444401 + Rhyme Room Entrance: + item: 444417 + Hidden Room: + Dead End Door: + item: 444419 + Knight Night Entrance: + item: 444421 + Seeker Entrance: + item: 444422 + location: 444407 + Rhyme Room Entrance: + item: 444423 + Second Room: + Exit Door: + item: 444424 + location: 445203 + Hub Room: + Crossroads Entrance: + item: 444425 + location: 444432 + Tenacious Entrance: + item: 444426 + location: 444433 + Symmetry Door: + item: 444428 + location: 445204 + Shortcut to Hedge Maze: + item: 444430 + location: 444436 + Near RAT Door: + item: 444432 + Traveled Entrance: + item: 444433 + location: 444438 + Lost Door: + item: 444435 + location: 444440 + Pilgrim Antechamber: + Sun Painting: + item: 444436 + location: 445205 + Pilgrim Room: + Shortcut to The Seeker: + item: 444437 + location: 444449 + Crossroads: + Tenacious Entrance: + item: 444438 + location: 444462 + Discerning Entrance: + item: 444439 + location: 444463 + Tower Entrance: + item: 444440 + location: 444465 + Tower Back Entrance: + item: 444442 + location: 445206 + Words Sword Door: + item: 444443 + location: 445207 + Eye Wall: + item: 444445 + location: 444469 + Hollow Hallway: + item: 444446 + Roof Access: + item: 444447 + Lost Area: + Exit: + item: 444448 + location: 445208 + Amen Name Area: + Exit: + item: 444449 + location: 445209 + The Tenacious: + Shortcut to Hub Room: + item: 444450 + location: 445210 + White Palindromes: + location: 445211 + Warts Straw Area: + Door: + item: 444451 + location: 445212 + Leaf Feel Area: + Door: + item: 444452 + location: 445213 + Outside The Agreeable: + Tenacious Entrance: + item: 444453 + location: 444496 + Black Door: + item: 444454 + location: 444497 + Agreeable Entrance: + item: 444455 + location: 444498 + Painting Shortcut: + item: 444456 + location: 444501 + Purple Barrier: + item: 444457 + Hallway Door: + item: 444459 + location: 445214 + Dread Hallway: + Tenacious Entrance: + item: 444462 + location: 444516 + The Agreeable: + Shortcut to Hedge Maze: + item: 444463 + location: 444518 + Hedge Maze: + Perceptive Entrance: + item: 444464 + location: 444530 + Painting Shortcut: + item: 444465 + Observant Entrance: + item: 444466 + Hide and Seek: + location: 445215 + The Fearless (First Floor): + Second Floor: + item: 444468 + location: 445216 + The Fearless (Second Floor): + Third Floor: + item: 444471 + location: 445217 + The Observant: + Backside Door: + item: 444472 + location: 445218 + Stairs: + item: 444474 + location: 444569 + The Incomparable: + Eight Door: + item: 444475 + location: 445219 + Orange Tower: + Second Floor: + item: 444476 + Third Floor: + item: 444477 + Fourth Floor: + item: 444478 + Fifth Floor: + item: 444479 + Sixth Floor: + item: 444480 + Seventh Floor: + item: 444481 + Orange Tower First Floor: + Shortcut to Hub Room: + item: 444483 + location: 444602 + Salt Pepper Door: + item: 444485 + location: 445220 + Orange Tower Third Floor: + Red Barrier: + item: 444486 + Rhyme Room Entrance: + item: 444487 + Orange Barrier: + item: 444488 + location: 445221 + Orange Tower Fourth Floor: + Hot Crusts Door: + item: 444490 + location: 444610 + Orange Tower Fifth Floor: + Welcome Back: + item: 444491 + location: 445222 + Orange Tower Seventh Floor: + Mastery: + item: 444493 + Mastery Panels: + location: 445223 + Courtyard: + Painting Shortcut: + item: 444494 + Green Barrier: + item: 444495 + First Second Third Fourth: + Backside Door: + item: 444496 + location: 445224 + The Colorful (White): + Progress Door: + item: 444497 + location: 445225 + The Colorful (Black): + Progress Door: + item: 444499 + location: 445226 + The Colorful (Red): + Progress Door: + item: 444500 + location: 445227 + The Colorful (Yellow): + Progress Door: + item: 444501 + location: 445228 + The Colorful (Blue): + Progress Door: + item: 444502 + location: 445229 + The Colorful (Purple): + Progress Door: + item: 444503 + location: 445230 + The Colorful (Orange): + Progress Door: + item: 444504 + location: 445231 + The Colorful (Green): + Progress Door: + item: 444505 + location: 445232 + The Colorful (Brown): + Progress Door: + item: 444506 + location: 445233 + The Colorful (Gray): + Progress Door: + item: 444507 + location: 445234 + Welcome Back Area: + Shortcut to Starting Room: + item: 444508 + location: 444653 + Owl Hallway: + Shortcut to Hedge Maze: + item: 444509 + location: 444656 + Outside The Initiated: + Shortcut to Hub Room: + item: 444510 + location: 444664 + Blue Barrier: + item: 444511 + Orange Barrier: + item: 444512 + Initiated Entrance: + item: 444513 + location: 444665 + Green Barrier: + item: 444514 + location: 445235 + Purple Barrier: + item: 444515 + location: 445236 + Entrance: + item: 444516 + location: 445237 + Eight Door: + item: 444578 + The Traveled: + Color Hallways Entrance: + item: 444517 + location: 444698 + Outside The Bold: + Bold Entrance: + item: 444518 + location: 444711 + Painting Shortcut: + item: 444519 + Steady Entrance: + item: 444520 + location: 444712 + Outside The Undeterred: + Undeterred Entrance: + item: 444521 + location: 444744 + Painting Shortcut: + item: 444522 + Green Painting: + item: 444523 + Twos: + item: 444524 + location: 444752 + Threes: + item: 444525 + location: 445238 + Number Hunt: + item: 444526 + location: 445239 + Fours: + item: 444527 + Fives: + item: 444528 + location: 445240 + Challenge Entrance: + item: 444529 + location: 444751 + Number Hunt: + Door to Directional Gallery: + item: 444530 + Sixes: + item: 444532 + location: 445241 + Sevens: + item: 444533 + location: 445242 + Eights: + item: 444534 + location: 445243 + Nines: + item: 444535 + location: 445244 + Zero Door: + item: 444536 + location: 445245 + Directional Gallery: + Shortcut to The Undeterred: + item: 444537 + location: 445246 + Yellow Barrier: + item: 444538 + Champion's Rest: + Shortcut to The Steady: + item: 444539 + location: 444806 + The Bearer: + Shortcut to The Bold: + item: 444540 + location: 444820 + Backside Door: + item: 444541 + location: 444821 + Bearer Side Area: + Shortcut to Tower: + item: 444542 + location: 445247 + Knight Night (Final): + Exit: + item: 444543 + location: 445248 + The Artistic (Smiley): + Door to Panda: + item: 444544 + location: 445249 + The Artistic (Panda): + Door to Lattice: + item: 444546 + location: 445250 + The Artistic (Lattice): + Door to Apple: + item: 444547 + location: 445251 + The Artistic (Apple): + Door to Smiley: + item: 444548 + location: 445252 + The Eyes They See: + Exit: + item: 444549 + location: 444937 + Outside The Wondrous: + Wondrous Entrance: + item: 444550 + location: 444940 + The Wondrous (Doorknob): + Painting Shortcut: + item: 444551 + The Wondrous: + Exit: + item: 444552 + location: 444947 + Hallway Room (2): + Exit: + item: 444553 + location: 445253 + Hallway Room (3): + Exit: + item: 444554 + location: 445254 + Hallway Room (4): + Exit: + item: 444555 + location: 445255 + Outside The Wanderer: + Wanderer Entrance: + item: 444556 + location: 444966 + Tower Entrance: + item: 444557 + Art Gallery: + Second Floor: + item: 444558 + First Floor Puzzles: + location: 445256 + Third Floor: + item: 444559 + Fourth Floor: + item: 444560 + Fifth Floor: + item: 444561 + Exit: + item: 444562 + location: 444981 + Art Gallery (Second Floor): + Puzzles: + location: 445257 + Art Gallery (Third Floor): + Puzzles: + location: 445258 + Art Gallery (Fourth Floor): + Puzzles: + location: 445259 + Rhyme Room (Smiley): + Door to Target: + item: 444564 + Door to Target (Location): + location: 445260 + Rhyme Room (Cross): + Exit: + item: 444565 + location: 445261 + Rhyme Room (Circle): + Door to Smiley: + item: 444566 + location: 445262 + Rhyme Room (Looped Square): + Door to Circle: + item: 444567 + location: 445263 + Door to Cross: + item: 444568 + location: 445264 + Door to Target: + item: 444569 + location: 445265 + Rhyme Room (Target): + Door to Cross: + item: 444570 + location: 445266 + Room Room: + Shortcut to Fifth Floor: + item: 444571 + location: 445076 + Outside The Wise: + Wise Entrance: + item: 444572 + location: 445267 + Outside The Scientific: + Scientific Entrance: + item: 444573 + location: 445130 + The Scientific: + Chemistry Puzzles: + location: 445268 + Biology Puzzles: + location: 445269 + Physics Puzzles: + location: 445270 + Challenge Room: + Welcome Door: + item: 444574 + location: 445176 +door_groups: + Rhyme Room Doors: 444418 + Dead End Area Access: 444420 + Entrances to The Tenacious: 444427 + Symmetry Doors: 444429 + Hedge Maze Doors: 444431 + Entrance to The Traveled: 444434 + Crossroads - Tower Entrances: 444441 + Crossroads Doors: 444444 + Color Hunt Barriers: 444458 + Hallway Room Doors: 444460 + Observant Doors: 444467 + Fearless Doors: 444469 + Backside Doors: 444473 + Orange Tower First Floor - Shortcuts: 444484 + Champion's Rest - Color Barriers: 444489 + Welcome Back Doors: 444492 + Colorful Doors: 444498 + Directional Gallery Doors: 444531 + Artistic Doors: 444545 +progression: + Progressive Hallway Room: 444461 + Progressive Fearless: 444470 + Progressive Orange Tower: 444482 + Progressive Art Gallery: 444563 diff --git a/worlds/lingo/items.py b/worlds/lingo/items.py new file mode 100644 index 000000000000..af24570f278e --- /dev/null +++ b/worlds/lingo/items.py @@ -0,0 +1,106 @@ +from typing import Dict, List, NamedTuple, Optional, TYPE_CHECKING + +from BaseClasses import Item, ItemClassification +from .options import ShuffleDoors +from .static_logic import DOORS_BY_ROOM, PROGRESSION_BY_ROOM, PROGRESSIVE_ITEMS, get_door_group_item_id, \ + get_door_item_id, get_progressive_item_id, get_special_item_id + +if TYPE_CHECKING: + from . import LingoWorld + + +class ItemData(NamedTuple): + """ + ItemData for an item in Lingo + """ + code: int + classification: ItemClassification + mode: Optional[str] + door_ids: List[str] + painting_ids: List[str] + + def should_include(self, world: "LingoWorld") -> bool: + if self.mode == "colors": + return world.options.shuffle_colors > 0 + elif self.mode == "doors": + return world.options.shuffle_doors != ShuffleDoors.option_none + elif self.mode == "orange tower": + # door shuffle is on and tower isn't progressive + return world.options.shuffle_doors != ShuffleDoors.option_none \ + and not world.options.progressive_orange_tower + elif self.mode == "complex door": + return world.options.shuffle_doors == ShuffleDoors.option_complex + elif self.mode == "door group": + return world.options.shuffle_doors == ShuffleDoors.option_simple + elif self.mode == "special": + return False + else: + return True + + +class LingoItem(Item): + """ + Item from the game Lingo + """ + game: str = "Lingo" + + +ALL_ITEM_TABLE: Dict[str, ItemData] = {} + + +def load_item_data(): + global ALL_ITEM_TABLE + + for color in ["Black", "Red", "Blue", "Yellow", "Green", "Orange", "Gray", "Brown", "Purple"]: + ALL_ITEM_TABLE[color] = ItemData(get_special_item_id(color), ItemClassification.progression, + "colors", [], []) + + door_groups: Dict[str, List[str]] = {} + for room_name, doors in DOORS_BY_ROOM.items(): + for door_name, door in doors.items(): + if door.skip_item is True or door.event is True: + continue + + if door.group is None: + door_mode = "doors" + else: + door_mode = "complex door" + door_groups.setdefault(door.group, []).extend(door.door_ids) + + if room_name in PROGRESSION_BY_ROOM and door_name in PROGRESSION_BY_ROOM[room_name]: + if room_name == "Orange Tower": + door_mode = "orange tower" + else: + door_mode = "special" + + ALL_ITEM_TABLE[door.item_name] = \ + ItemData(get_door_item_id(room_name, door_name), + ItemClassification.filler if door.junk_item else ItemClassification.progression, door_mode, + door.door_ids, door.painting_ids) + + for group, group_door_ids in door_groups.items(): + ALL_ITEM_TABLE[group] = ItemData(get_door_group_item_id(group), + ItemClassification.progression, "door group", group_door_ids, []) + + special_items: Dict[str, ItemClassification] = { + ":)": ItemClassification.filler, + "The Feeling of Being Lost": ItemClassification.filler, + "Wanderlust": ItemClassification.filler, + "Empty White Hallways": ItemClassification.filler, + "Slowness Trap": ItemClassification.trap, + "Iceland Trap": ItemClassification.trap, + "Atbash Trap": ItemClassification.trap, + "Puzzle Skip": ItemClassification.useful, + } + + for item_name, classification in special_items.items(): + ALL_ITEM_TABLE[item_name] = ItemData(get_special_item_id(item_name), classification, + "special", [], []) + + for item_name in PROGRESSIVE_ITEMS: + ALL_ITEM_TABLE[item_name] = ItemData(get_progressive_item_id(item_name), + ItemClassification.progression, "special", [], []) + + +# Initialize the item data at module scope. +load_item_data() diff --git a/worlds/lingo/locations.py b/worlds/lingo/locations.py new file mode 100644 index 000000000000..5903d603ec4f --- /dev/null +++ b/worlds/lingo/locations.py @@ -0,0 +1,80 @@ +from enum import Flag, auto +from typing import Dict, List, NamedTuple + +from BaseClasses import Location +from .static_logic import DOORS_BY_ROOM, PANELS_BY_ROOM, RoomAndPanel, get_door_location_id, get_panel_location_id + + +class LocationClassification(Flag): + normal = auto() + reduced = auto() + insanity = auto() + + +class LocationData(NamedTuple): + """ + LocationData for a location in Lingo + """ + code: int + room: str + panels: List[RoomAndPanel] + classification: LocationClassification + + def panel_ids(self): + ids = set() + for panel in self.panels: + effective_room = self.room if panel.room is None else panel.room + panel_data = PANELS_BY_ROOM[effective_room][panel.panel] + ids = ids | set(panel_data.internal_ids) + return ids + + +class LingoLocation(Location): + """ + Location from the game Lingo + """ + game: str = "Lingo" + + +ALL_LOCATION_TABLE: Dict[str, LocationData] = {} + + +def load_location_data(): + global ALL_LOCATION_TABLE + + for room_name, panels in PANELS_BY_ROOM.items(): + for panel_name, panel in panels.items(): + location_name = f"{room_name} - {panel_name}" + + classification = LocationClassification.insanity + if panel.check: + classification |= LocationClassification.normal + + if not panel.exclude_reduce: + classification |= LocationClassification.reduced + + ALL_LOCATION_TABLE[location_name] = \ + LocationData(get_panel_location_id(room_name, panel_name), room_name, + [RoomAndPanel(None, panel_name)], classification) + + for room_name, doors in DOORS_BY_ROOM.items(): + for door_name, door in doors.items(): + if door.skip_location or door.event or door.panels is None: + continue + + location_name = door.location_name + classification = LocationClassification.normal + if door.include_reduce: + classification |= LocationClassification.reduced + + if location_name in ALL_LOCATION_TABLE: + new_id = ALL_LOCATION_TABLE[location_name].code + classification |= ALL_LOCATION_TABLE[location_name].classification + else: + new_id = get_door_location_id(room_name, door_name) + + ALL_LOCATION_TABLE[location_name] = LocationData(new_id, room_name, door.panels, classification) + + +# Initialize location data on the module scope. +load_location_data() diff --git a/worlds/lingo/options.py b/worlds/lingo/options.py new file mode 100644 index 000000000000..7dc6a1389c0c --- /dev/null +++ b/worlds/lingo/options.py @@ -0,0 +1,126 @@ +from dataclasses import dataclass + +from Options import Toggle, Choice, DefaultOnToggle, Range, PerGameCommonOptions + + +class ShuffleDoors(Choice): + """If on, opening doors will require their respective "keys". + In "simple", doors are sorted into logical groups, which are all opened by receiving an item. + In "complex", the items are much more granular, and will usually only open a single door each.""" + display_name = "Shuffle Doors" + option_none = 0 + option_simple = 1 + option_complex = 2 + + +class ProgressiveOrangeTower(DefaultOnToggle): + """When "Shuffle Doors" is on, this setting governs the manner in which the Orange Tower floors open up. + If off, there is an item for each floor of the tower, and each floor's item is the only one needed to access that floor. + If on, there are six progressive items, which open up the tower from the bottom floor upward. + """ + display_name = "Progressive Orange Tower" + + +class LocationChecks(Choice): + """On "normal", there will be a location check for each panel set that would ordinarily open a door, as well as for + achievement panels and a small handful of other panels. + On "reduced", many of the locations that are associated with opening doors are removed. + On "insanity", every individual panel in the game is a location check.""" + display_name = "Location Checks" + option_normal = 0 + option_reduced = 1 + option_insanity = 2 + + +class ShuffleColors(Toggle): + """If on, an item is added to the pool for every puzzle color (besides White). + You will need to unlock the requisite colors in order to be able to solve puzzles of that color.""" + display_name = "Shuffle Colors" + + +class ShufflePanels(Choice): + """If on, the puzzles on each panel are randomized. + On "rearrange", the puzzles are the same as the ones in the base game, but are placed in different areas.""" + display_name = "Shuffle Panels" + option_none = 0 + option_rearrange = 1 + + +class ShufflePaintings(Toggle): + """If on, the destination, location, and appearance of the painting warps in the game will be randomized.""" + display_name = "Shuffle Paintings" + + +class VictoryCondition(Choice): + """Change the victory condition.""" + display_name = "Victory Condition" + option_the_end = 0 + option_the_master = 1 + option_level_2 = 2 + + +class MasteryAchievements(Range): + """The number of achievements required to unlock THE MASTER. + In the base game, 21 achievements are needed. + If you include The Scientific and The Unchallenged, which are in the base game but are not counted for mastery, 23 would be required. + If you include the custom achievement (The Wanderer), 24 would be required. + """ + display_name = "Mastery Achievements" + range_start = 1 + range_end = 24 + default = 21 + + +class Level2Requirement(Range): + """The number of panel solves required to unlock LEVEL 2. + In the base game, 223 are needed. + Note that this count includes ANOTHER TRY. + """ + display_name = "Level 2 Requirement" + range_start = 2 + range_end = 800 + default = 223 + + +class EarlyColorHallways(Toggle): + """When on, a painting warp to the color hallways area will appear in the starting room. + This lets you avoid being trapped in the starting room for long periods of time when door shuffle is on.""" + display_name = "Early Color Hallways" + + +class TrapPercentage(Range): + """Replaces junk items with traps, at the specified rate.""" + display_name = "Trap Percentage" + range_start = 0 + range_end = 100 + default = 20 + + +class PuzzleSkipPercentage(Range): + """Replaces junk items with puzzle skips, at the specified rate.""" + display_name = "Puzzle Skip Percentage" + range_start = 0 + range_end = 100 + default = 20 + + +class DeathLink(Toggle): + """If on: Whenever another player on death link dies, you will be returned to the starting room.""" + display_name = "Death Link" + + +@dataclass +class LingoOptions(PerGameCommonOptions): + shuffle_doors: ShuffleDoors + progressive_orange_tower: ProgressiveOrangeTower + location_checks: LocationChecks + shuffle_colors: ShuffleColors + shuffle_panels: ShufflePanels + shuffle_paintings: ShufflePaintings + victory_condition: VictoryCondition + mastery_achievements: MasteryAchievements + level_2_requirement: Level2Requirement + early_color_hallways: EarlyColorHallways + trap_percentage: TrapPercentage + puzzle_skip_percentage: PuzzleSkipPercentage + death_link: DeathLink diff --git a/worlds/lingo/player_logic.py b/worlds/lingo/player_logic.py new file mode 100644 index 000000000000..abb975e020ae --- /dev/null +++ b/worlds/lingo/player_logic.py @@ -0,0 +1,296 @@ +from typing import Dict, List, NamedTuple, Optional, TYPE_CHECKING + +from .items import ALL_ITEM_TABLE +from .locations import ALL_LOCATION_TABLE, LocationClassification +from .options import LocationChecks, ShuffleDoors, VictoryCondition +from .static_logic import DOORS_BY_ROOM, Door, PAINTINGS, PAINTINGS_BY_ROOM, PAINTING_ENTRANCES, PAINTING_EXITS, \ + PANELS_BY_ROOM, PROGRESSION_BY_ROOM, REQUIRED_PAINTING_ROOMS, REQUIRED_PAINTING_WHEN_NO_DOORS_ROOMS, ROOMS, \ + RoomAndPanel +from .testing import LingoTestOptions + +if TYPE_CHECKING: + from . import LingoWorld + + +class PlayerLocation(NamedTuple): + name: str + code: Optional[int] = None + panels: List[RoomAndPanel] = [] + + +class LingoPlayerLogic: + """ + Defines logic after a player's options have been applied + """ + + ITEM_BY_DOOR: Dict[str, Dict[str, str]] + + LOCATIONS_BY_ROOM: Dict[str, List[PlayerLocation]] + REAL_LOCATIONS: List[str] + + EVENT_LOC_TO_ITEM: Dict[str, str] + REAL_ITEMS: List[str] + + VICTORY_CONDITION: str + MASTERY_LOCATION: str + LEVEL_2_LOCATION: str + + PAINTING_MAPPING: Dict[str, str] + + FORCED_GOOD_ITEM: str + + def add_location(self, room: str, loc: PlayerLocation): + self.LOCATIONS_BY_ROOM.setdefault(room, []).append(loc) + + def set_door_item(self, room: str, door: str, item: str): + self.ITEM_BY_DOOR.setdefault(room, {})[door] = item + + def handle_non_grouped_door(self, room_name: str, door_data: Door, world: "LingoWorld"): + if room_name in PROGRESSION_BY_ROOM and door_data.name in PROGRESSION_BY_ROOM[room_name]: + if room_name == "Orange Tower" and not world.options.progressive_orange_tower: + self.set_door_item(room_name, door_data.name, door_data.item_name) + else: + progressive_item_name = PROGRESSION_BY_ROOM[room_name][door_data.name].item_name + self.set_door_item(room_name, door_data.name, progressive_item_name) + self.REAL_ITEMS.append(progressive_item_name) + else: + self.set_door_item(room_name, door_data.name, door_data.item_name) + + def __init__(self, world: "LingoWorld"): + self.ITEM_BY_DOOR = {} + self.LOCATIONS_BY_ROOM = {} + self.REAL_LOCATIONS = [] + self.EVENT_LOC_TO_ITEM = {} + self.REAL_ITEMS = [] + self.VICTORY_CONDITION = "" + self.MASTERY_LOCATION = "" + self.LEVEL_2_LOCATION = "" + self.PAINTING_MAPPING = {} + self.FORCED_GOOD_ITEM = "" + + door_shuffle = world.options.shuffle_doors + color_shuffle = world.options.shuffle_colors + painting_shuffle = world.options.shuffle_paintings + location_checks = world.options.location_checks + victory_condition = world.options.victory_condition + early_color_hallways = world.options.early_color_hallways + + if location_checks == LocationChecks.option_reduced and door_shuffle != ShuffleDoors.option_none: + raise Exception("You cannot have reduced location checks when door shuffle is on, because there would not " + "be enough locations for all of the door items.") + + # Create an event for every door, representing whether that door has been opened. Also create event items for + # doors that are event-only. + for room_name, room_data in DOORS_BY_ROOM.items(): + for door_name, door_data in room_data.items(): + if door_shuffle == ShuffleDoors.option_none: + itemloc_name = f"{room_name} - {door_name} (Opened)" + self.add_location(room_name, PlayerLocation(itemloc_name, None, door_data.panels)) + self.EVENT_LOC_TO_ITEM[itemloc_name] = itemloc_name + self.set_door_item(room_name, door_name, itemloc_name) + else: + # This line is duplicated from StaticLingoItems + if door_data.skip_item is False and door_data.event is False: + if door_data.group is not None and door_shuffle == ShuffleDoors.option_simple: + # Grouped doors are handled differently if shuffle doors is on simple. + self.set_door_item(room_name, door_name, door_data.group) + else: + self.handle_non_grouped_door(room_name, door_data, world) + + if door_data.event: + self.add_location(room_name, PlayerLocation(door_data.item_name, None, door_data.panels)) + self.EVENT_LOC_TO_ITEM[door_data.item_name] = door_data.item_name + " (Opened)" + self.set_door_item(room_name, door_name, door_data.item_name + " (Opened)") + + # Create events for each achievement panel, so that we can determine when THE MASTER is accessible. We also + # create events for each counting panel, so that we can determine when LEVEL 2 is accessible. + for room_name, room_data in PANELS_BY_ROOM.items(): + for panel_name, panel_data in room_data.items(): + if panel_data.achievement: + event_name = room_name + " - " + panel_name + " (Achieved)" + self.add_location(room_name, PlayerLocation(event_name, None, + [RoomAndPanel(room_name, panel_name)])) + self.EVENT_LOC_TO_ITEM[event_name] = "Mastery Achievement" + + if not panel_data.non_counting and victory_condition == VictoryCondition.option_level_2: + event_name = room_name + " - " + panel_name + " (Counted)" + self.add_location(room_name, PlayerLocation(event_name, None, + [RoomAndPanel(room_name, panel_name)])) + self.EVENT_LOC_TO_ITEM[event_name] = "Counting Panel Solved" + + # Handle the victory condition. Victory conditions other than the chosen one become regular checks, so we need + # to prevent the actual victory condition from becoming a check. + self.MASTERY_LOCATION = "Orange Tower Seventh Floor - THE MASTER" + self.LEVEL_2_LOCATION = "N/A" + + if victory_condition == VictoryCondition.option_the_end: + self.VICTORY_CONDITION = "Orange Tower Seventh Floor - THE END" + self.add_location("Orange Tower Seventh Floor", PlayerLocation("The End (Solved)")) + self.EVENT_LOC_TO_ITEM["The End (Solved)"] = "Victory" + elif victory_condition == VictoryCondition.option_the_master: + self.VICTORY_CONDITION = "Orange Tower Seventh Floor - THE MASTER" + self.MASTERY_LOCATION = "Orange Tower Seventh Floor - Mastery Achievements" + + self.add_location("Orange Tower Seventh Floor", PlayerLocation(self.MASTERY_LOCATION, None, [])) + self.EVENT_LOC_TO_ITEM[self.MASTERY_LOCATION] = "Victory" + elif victory_condition == VictoryCondition.option_level_2: + self.VICTORY_CONDITION = "Second Room - LEVEL 2" + self.LEVEL_2_LOCATION = "Second Room - Unlock Level 2" + + self.add_location("Second Room", PlayerLocation(self.LEVEL_2_LOCATION, None, + [RoomAndPanel("Second Room", "LEVEL 2")])) + self.EVENT_LOC_TO_ITEM[self.LEVEL_2_LOCATION] = "Victory" + + # Instantiate all real locations. + location_classification = LocationClassification.normal + if location_checks == LocationChecks.option_reduced: + location_classification = LocationClassification.reduced + elif location_checks == LocationChecks.option_insanity: + location_classification = LocationClassification.insanity + + for location_name, location_data in ALL_LOCATION_TABLE.items(): + if location_name != self.VICTORY_CONDITION: + if location_classification not in location_data.classification: + continue + + self.add_location(location_data.room, PlayerLocation(location_name, location_data.code, + location_data.panels)) + self.REAL_LOCATIONS.append(location_name) + + # Instantiate all real items. + for name, item in ALL_ITEM_TABLE.items(): + if item.should_include(world): + self.REAL_ITEMS.append(name) + + # Create the paintings mapping, if painting shuffle is on. + if painting_shuffle: + # Shuffle paintings until we get something workable. + workable_paintings = False + for i in range(0, 20): + workable_paintings = self.randomize_paintings(world) + if workable_paintings: + break + + if not workable_paintings: + raise Exception("This Lingo world was unable to generate a workable painting mapping after 20 " + "iterations. This is very unlikely to happen on its own, and probably indicates some " + "kind of logic error.") + + if door_shuffle != ShuffleDoors.option_none and location_classification != LocationClassification.insanity \ + and not early_color_hallways and LingoTestOptions.disable_forced_good_item is False: + # If shuffle doors is on, force a useful item onto the HI panel. This may not necessarily get you out of BK, + # but the goal is to allow you to reach at least one more check. The non-painting ones are hardcoded right + # now. We only allow the entrance to the Pilgrim Room if color shuffle is off, because otherwise there are + # no extra checks in there. We only include the entrance to the Rhyme Room when color shuffle is off and + # door shuffle is on simple, because otherwise there are no extra checks in there. + good_item_options: List[str] = ["Starting Room - Back Right Door", "Second Room - Exit Door"] + + if not color_shuffle: + good_item_options.append("Pilgrim Room - Sun Painting") + + if door_shuffle == ShuffleDoors.option_simple: + good_item_options += ["Welcome Back Doors"] + + if not color_shuffle: + good_item_options.append("Rhyme Room Doors") + else: + good_item_options += ["Welcome Back Area - Shortcut to Starting Room"] + + for painting_obj in PAINTINGS_BY_ROOM["Starting Room"]: + if not painting_obj.enter_only or painting_obj.required_door is None: + continue + + # If painting shuffle is on, we only want to consider paintings that actually go somewhere. + if painting_shuffle and painting_obj.id not in self.PAINTING_MAPPING.keys(): + continue + + pdoor = DOORS_BY_ROOM[painting_obj.required_door.room][painting_obj.required_door.door] + good_item_options.append(pdoor.item_name) + + # Copied from The Witness -- remove any plandoed items from the possible good items set. + for v in world.multiworld.plando_items[world.player]: + if v.get("from_pool", True): + for item_key in {"item", "items"}: + if item_key in v: + if type(v[item_key]) is str: + if v[item_key] in good_item_options: + good_item_options.remove(v[item_key]) + elif type(v[item_key]) is dict: + for item, weight in v[item_key].items(): + if weight and item in good_item_options: + good_item_options.remove(item) + else: + # Other type of iterable + for item in v[item_key]: + if item in good_item_options: + good_item_options.remove(item) + + if len(good_item_options) > 0: + self.FORCED_GOOD_ITEM = world.random.choice(good_item_options) + self.REAL_ITEMS.remove(self.FORCED_GOOD_ITEM) + self.REAL_LOCATIONS.remove("Second Room - Good Luck") + + def randomize_paintings(self, world: "LingoWorld") -> bool: + self.PAINTING_MAPPING.clear() + + door_shuffle = world.options.shuffle_doors + + # First, assign mappings to the required-exit paintings. We ensure that req-blocked paintings do not lead to + # required paintings. + req_exits = [] + required_painting_rooms = REQUIRED_PAINTING_ROOMS + if door_shuffle == ShuffleDoors.option_none: + required_painting_rooms += REQUIRED_PAINTING_WHEN_NO_DOORS_ROOMS + req_exits = [painting_id for painting_id, painting in PAINTINGS.items() if painting.required_when_no_doors] + req_enterable = [painting_id for painting_id, painting in PAINTINGS.items() + if not painting.exit_only and not painting.disable and not painting.req_blocked and + not painting.req_blocked_when_no_doors and painting.room not in required_painting_rooms] + else: + req_enterable = [painting_id for painting_id, painting in PAINTINGS.items() + if not painting.exit_only and not painting.disable and not painting.req_blocked and + painting.room not in required_painting_rooms] + req_exits += [painting_id for painting_id, painting in PAINTINGS.items() + if painting.exit_only and painting.required] + req_entrances = world.random.sample(req_enterable, len(req_exits)) + + self.PAINTING_MAPPING = dict(zip(req_entrances, req_exits)) + + # Next, determine the rest of the exit paintings. + exitable = [painting_id for painting_id, painting in PAINTINGS.items() + if not painting.enter_only and not painting.disable and painting_id not in req_exits and + painting_id not in req_entrances] + nonreq_exits = world.random.sample(exitable, PAINTING_EXITS - len(req_exits)) + chosen_exits = req_exits + nonreq_exits + + # Determine the rest of the entrance paintings. + enterable = [painting_id for painting_id, painting in PAINTINGS.items() + if not painting.exit_only and not painting.disable and painting_id not in chosen_exits and + painting_id not in req_entrances] + chosen_entrances = world.random.sample(enterable, PAINTING_ENTRANCES - len(req_entrances)) + + # Assign one entrance to each non-required exit, to ensure that the total number of exits is achieved. + for warp_exit in nonreq_exits: + warp_enter = world.random.choice(chosen_entrances) + chosen_entrances.remove(warp_enter) + self.PAINTING_MAPPING[warp_enter] = warp_exit + + # Assign each of the remaining entrances to any required or non-required exit. + for warp_enter in chosen_entrances: + warp_exit = world.random.choice(chosen_exits) + self.PAINTING_MAPPING[warp_enter] = warp_exit + + # The Eye Wall painting is unique in that it is both double-sided and also enter only (because it moves). + # There is only one eligible double-sided exit painting, which is the vanilla exit for this warp. If the + # exit painting is an entrance in the shuffle, we will disable the Eye Wall painting. Otherwise, Eye Wall + # is forced to point to the vanilla exit. + if "eye_painting_2" not in self.PAINTING_MAPPING.keys(): + self.PAINTING_MAPPING["eye_painting"] = "eye_painting_2" + + # Just for sanity's sake, ensure that all required painting rooms are accessed. + for painting_id, painting in PAINTINGS.items(): + if painting_id not in self.PAINTING_MAPPING.values() \ + and (painting.required or (painting.required_when_no_doors and + door_shuffle == ShuffleDoors.option_none)): + return False + + return True diff --git a/worlds/lingo/regions.py b/worlds/lingo/regions.py new file mode 100644 index 000000000000..e5f947de05e4 --- /dev/null +++ b/worlds/lingo/regions.py @@ -0,0 +1,91 @@ +from typing import Dict, TYPE_CHECKING + +from BaseClasses import ItemClassification, Region +from .items import LingoItem +from .locations import LingoLocation +from .player_logic import LingoPlayerLogic +from .rules import lingo_can_use_entrance, lingo_can_use_pilgrimage, make_location_lambda +from .static_logic import ALL_ROOMS, PAINTINGS, Room + +if TYPE_CHECKING: + from . import LingoWorld + + +def create_region(room: Room, world: "LingoWorld", player_logic: LingoPlayerLogic) -> Region: + new_region = Region(room.name, world.player, world.multiworld) + for location in player_logic.LOCATIONS_BY_ROOM.get(room.name, {}): + new_location = LingoLocation(world.player, location.name, location.code, new_region) + new_location.access_rule = make_location_lambda(location, room.name, world, player_logic) + new_region.locations.append(new_location) + if location.name in player_logic.EVENT_LOC_TO_ITEM: + event_name = player_logic.EVENT_LOC_TO_ITEM[location.name] + event_item = LingoItem(event_name, ItemClassification.progression, None, world.player) + new_location.place_locked_item(event_item) + + return new_region + + +def handle_pilgrim_room(regions: Dict[str, Region], world: "LingoWorld", player_logic: LingoPlayerLogic) -> None: + target_region = regions["Pilgrim Antechamber"] + source_region = regions["Outside The Agreeable"] + source_region.connect( + target_region, + "Pilgrimage", + lambda state: lingo_can_use_pilgrimage(state, world.player, player_logic)) + + +def connect_painting(regions: Dict[str, Region], warp_enter: str, warp_exit: str, world: "LingoWorld", + player_logic: LingoPlayerLogic) -> None: + source_painting = PAINTINGS[warp_enter] + target_painting = PAINTINGS[warp_exit] + + target_region = regions[target_painting.room] + source_region = regions[source_painting.room] + source_region.connect( + target_region, + f"{source_painting.room} to {target_painting.room} ({source_painting.id} Painting)", + lambda state: lingo_can_use_entrance(state, target_painting.room, source_painting.required_door, world.player, + player_logic)) + + +def create_regions(world: "LingoWorld", player_logic: LingoPlayerLogic) -> None: + regions = { + "Menu": Region("Menu", world.player, world.multiworld) + } + + painting_shuffle = world.options.shuffle_paintings + early_color_hallways = world.options.early_color_hallways + + # Instantiate all rooms as regions with their locations first. + for room in ALL_ROOMS: + regions[room.name] = create_region(room, world, player_logic) + + # Connect all created regions now that they exist. + for room in ALL_ROOMS: + for entrance in room.entrances: + # Don't use the vanilla painting connections if we are shuffling paintings. + if entrance.painting and painting_shuffle: + continue + + entrance_name = f"{entrance.room} to {room.name}" + if entrance.door is not None: + if entrance.door.room is not None: + entrance_name += f" (through {entrance.door.room} - {entrance.door.door})" + else: + entrance_name += f" (through {room.name} - {entrance.door.door})" + + regions[entrance.room].connect( + regions[room.name], entrance_name, + lambda state, r=room, e=entrance: lingo_can_use_entrance(state, r.name, e.door, world.player, + player_logic)) + + handle_pilgrim_room(regions, world, player_logic) + + if early_color_hallways: + regions["Starting Room"].connect(regions["Outside The Undeterred"], "Early Color Hallways") + + if painting_shuffle: + for warp_enter, warp_exit in player_logic.PAINTING_MAPPING.items(): + connect_painting(regions, warp_enter, warp_exit, world, player_logic) + + world.multiworld.regions += regions.values() diff --git a/worlds/lingo/rules.py b/worlds/lingo/rules.py new file mode 100644 index 000000000000..d59b8a1ef78a --- /dev/null +++ b/worlds/lingo/rules.py @@ -0,0 +1,104 @@ +from typing import TYPE_CHECKING + +from BaseClasses import CollectionState +from .options import VictoryCondition +from .player_logic import LingoPlayerLogic, PlayerLocation +from .static_logic import PANELS_BY_ROOM, PROGRESSION_BY_ROOM, PROGRESSIVE_ITEMS, RoomAndDoor + +if TYPE_CHECKING: + from . import LingoWorld + + +def lingo_can_use_entrance(state: CollectionState, room: str, door: RoomAndDoor, player: int, + player_logic: LingoPlayerLogic): + if door is None: + return True + + return _lingo_can_open_door(state, room, room if door.room is None else door.room, door.door, player, player_logic) + + +def lingo_can_use_pilgrimage(state: CollectionState, player: int, player_logic: LingoPlayerLogic): + fake_pilgrimage = [ + ["Second Room", "Exit Door"], ["Crossroads", "Tower Entrance"], + ["Orange Tower Fourth Floor", "Hot Crusts Door"], ["Outside The Initiated", "Shortcut to Hub Room"], + ["Orange Tower First Floor", "Shortcut to Hub Room"], ["Directional Gallery", "Shortcut to The Undeterred"], + ["Orange Tower First Floor", "Salt Pepper Door"], ["Hub Room", "Crossroads Entrance"], + ["Champion's Rest", "Shortcut to The Steady"], ["The Bearer", "Shortcut to The Bold"], + ["Art Gallery", "Exit"], ["The Tenacious", "Shortcut to Hub Room"], + ["Outside The Agreeable", "Tenacious Entrance"] + ] + for entrance in fake_pilgrimage: + if not state.has(player_logic.ITEM_BY_DOOR[entrance[0]][entrance[1]], player): + return False + + return True + + +def lingo_can_use_location(state: CollectionState, location: PlayerLocation, room_name: str, world: "LingoWorld", + player_logic: LingoPlayerLogic): + for panel in location.panels: + panel_room = room_name if panel.room is None else panel.room + if not _lingo_can_solve_panel(state, room_name, panel_room, panel.panel, world, player_logic): + return False + + return True + + +def lingo_can_use_mastery_location(state: CollectionState, world: "LingoWorld"): + return state.has("Mastery Achievement", world.player, world.options.mastery_achievements.value) + + +def _lingo_can_open_door(state: CollectionState, start_room: str, room: str, door: str, player: int, + player_logic: LingoPlayerLogic): + """ + Determines whether a door can be opened + """ + item_name = player_logic.ITEM_BY_DOOR[room][door] + if item_name in PROGRESSIVE_ITEMS: + progression = PROGRESSION_BY_ROOM[room][door] + return state.has(item_name, player, progression.index) + + return state.has(item_name, player) + + +def _lingo_can_solve_panel(state: CollectionState, start_room: str, room: str, panel: str, world: "LingoWorld", + player_logic: LingoPlayerLogic): + """ + Determines whether a panel can be solved + """ + if start_room != room and not state.can_reach(room, "Region", world.player): + return False + + if room == "Second Room" and panel == "ANOTHER TRY" \ + and world.options.victory_condition == VictoryCondition.option_level_2 \ + and not state.has("Counting Panel Solved", world.player, world.options.level_2_requirement.value - 1): + return False + + panel_object = PANELS_BY_ROOM[room][panel] + for req_room in panel_object.required_rooms: + if not state.can_reach(req_room, "Region", world.player): + return False + + for req_door in panel_object.required_doors: + if not _lingo_can_open_door(state, start_room, room if req_door.room is None else req_door.room, + req_door.door, world.player, player_logic): + return False + + for req_panel in panel_object.required_panels: + if not _lingo_can_solve_panel(state, start_room, room if req_panel.room is None else req_panel.room, + req_panel.panel, world, player_logic): + return False + + if len(panel_object.colors) > 0 and world.options.shuffle_colors: + for color in panel_object.colors: + if not state.has(color.capitalize(), world.player): + return False + + return True + + +def make_location_lambda(location: PlayerLocation, room_name: str, world: "LingoWorld", player_logic: LingoPlayerLogic): + if location.name == player_logic.MASTERY_LOCATION: + return lambda state: lingo_can_use_mastery_location(state, world) + + return lambda state: lingo_can_use_location(state, location, room_name, world, player_logic) diff --git a/worlds/lingo/static_logic.py b/worlds/lingo/static_logic.py new file mode 100644 index 000000000000..f6690f93a439 --- /dev/null +++ b/worlds/lingo/static_logic.py @@ -0,0 +1,557 @@ +from typing import Dict, List, NamedTuple, Optional, Set + +import yaml + + +class RoomAndDoor(NamedTuple): + room: Optional[str] + door: str + + +class RoomAndPanel(NamedTuple): + room: Optional[str] + panel: str + + +class RoomEntrance(NamedTuple): + room: str # source room + door: Optional[RoomAndDoor] + painting: bool + + +class Room(NamedTuple): + name: str + entrances: List[RoomEntrance] + + +class Door(NamedTuple): + name: str + item_name: str + location_name: Optional[str] + panels: Optional[List[RoomAndPanel]] + skip_location: bool + skip_item: bool + door_ids: List[str] + painting_ids: List[str] + event: bool + group: Optional[str] + include_reduce: bool + junk_item: bool + + +class Panel(NamedTuple): + required_rooms: List[str] + required_doors: List[RoomAndDoor] + required_panels: List[RoomAndPanel] + colors: List[str] + check: bool + event: bool + internal_ids: List[str] + exclude_reduce: bool + achievement: bool + non_counting: bool + + +class Painting(NamedTuple): + id: str + room: str + enter_only: bool + exit_only: bool + orientation: str + required: bool + required_when_no_doors: bool + required_door: Optional[RoomAndDoor] + disable: bool + move: bool + req_blocked: bool + req_blocked_when_no_doors: bool + + +class Progression(NamedTuple): + item_name: str + index: int + + +ROOMS: Dict[str, Room] = {} +PANELS: Dict[str, Panel] = {} +DOORS: Dict[str, Door] = {} +PAINTINGS: Dict[str, Painting] = {} + +ALL_ROOMS: List[Room] = [] +DOORS_BY_ROOM: Dict[str, Dict[str, Door]] = {} +PANELS_BY_ROOM: Dict[str, Dict[str, Panel]] = {} +PAINTINGS_BY_ROOM: Dict[str, List[Painting]] = {} + +PROGRESSIVE_ITEMS: List[str] = [] +PROGRESSION_BY_ROOM: Dict[str, Dict[str, Progression]] = {} + +PAINTING_ENTRANCES: int = 0 +PAINTING_EXIT_ROOMS: Set[str] = set() +PAINTING_EXITS: int = 0 +REQUIRED_PAINTING_ROOMS: List[str] = [] +REQUIRED_PAINTING_WHEN_NO_DOORS_ROOMS: List[str] = [] + +SPECIAL_ITEM_IDS: Dict[str, int] = {} +PANEL_LOCATION_IDS: Dict[str, Dict[str, int]] = {} +DOOR_LOCATION_IDS: Dict[str, Dict[str, int]] = {} +DOOR_ITEM_IDS: Dict[str, Dict[str, int]] = {} +DOOR_GROUP_ITEM_IDS: Dict[str, int] = {} +PROGRESSIVE_ITEM_IDS: Dict[str, int] = {} + + +def load_static_data(): + global PAINTING_EXITS, SPECIAL_ITEM_IDS, PANEL_LOCATION_IDS, DOOR_LOCATION_IDS, DOOR_ITEM_IDS, \ + DOOR_GROUP_ITEM_IDS, PROGRESSIVE_ITEM_IDS + + try: + from importlib.resources import files + except ImportError: + from importlib_resources import files + + # Load in all item and location IDs. These are broken up into groups based on the type of item/location. + with files("worlds.lingo").joinpath("ids.yaml").open() as file: + config = yaml.load(file, Loader=yaml.Loader) + + if "special_items" in config: + for item_name, item_id in config["special_items"].items(): + SPECIAL_ITEM_IDS[item_name] = item_id + + if "panels" in config: + for room_name in config["panels"].keys(): + PANEL_LOCATION_IDS[room_name] = {} + + for panel_name, location_id in config["panels"][room_name].items(): + PANEL_LOCATION_IDS[room_name][panel_name] = location_id + + if "doors" in config: + for room_name in config["doors"].keys(): + DOOR_LOCATION_IDS[room_name] = {} + DOOR_ITEM_IDS[room_name] = {} + + for door_name, door_data in config["doors"][room_name].items(): + if "location" in door_data: + DOOR_LOCATION_IDS[room_name][door_name] = door_data["location"] + + if "item" in door_data: + DOOR_ITEM_IDS[room_name][door_name] = door_data["item"] + + if "door_groups" in config: + for item_name, item_id in config["door_groups"].items(): + DOOR_GROUP_ITEM_IDS[item_name] = item_id + + if "progression" in config: + for item_name, item_id in config["progression"].items(): + PROGRESSIVE_ITEM_IDS[item_name] = item_id + + # Process the main world file. + with files("worlds.lingo").joinpath("LL1.yaml").open() as file: + config = yaml.load(file, Loader=yaml.Loader) + + for room_name, room_data in config.items(): + process_room(room_name, room_data) + + PAINTING_EXITS = len(PAINTING_EXIT_ROOMS) + + +def get_special_item_id(name: str): + if name not in SPECIAL_ITEM_IDS: + raise Exception(f"Item ID for special item {name} not found in ids.yaml.") + + return SPECIAL_ITEM_IDS[name] + + +def get_panel_location_id(room: str, name: str): + if room not in PANEL_LOCATION_IDS or name not in PANEL_LOCATION_IDS[room]: + raise Exception(f"Location ID for panel {room} - {name} not found in ids.yaml.") + + return PANEL_LOCATION_IDS[room][name] + + +def get_door_location_id(room: str, name: str): + if room not in DOOR_LOCATION_IDS or name not in DOOR_LOCATION_IDS[room]: + raise Exception(f"Location ID for door {room} - {name} not found in ids.yaml.") + + return DOOR_LOCATION_IDS[room][name] + + +def get_door_item_id(room: str, name: str): + if room not in DOOR_ITEM_IDS or name not in DOOR_ITEM_IDS[room]: + raise Exception(f"Item ID for door {room} - {name} not found in ids.yaml.") + + return DOOR_ITEM_IDS[room][name] + + +def get_door_group_item_id(name: str): + if name not in DOOR_GROUP_ITEM_IDS: + raise Exception(f"Item ID for door group {name} not found in ids.yaml.") + + return DOOR_GROUP_ITEM_IDS[name] + + +def get_progressive_item_id(name: str): + if name not in PROGRESSIVE_ITEM_IDS: + raise Exception(f"Item ID for progressive item {name} not found in ids.yaml.") + + return PROGRESSIVE_ITEM_IDS[name] + + +def process_entrance(source_room, doors, room_obj): + global PAINTING_ENTRANCES, PAINTING_EXIT_ROOMS + + # If the value of an entrance is just True, that means that the entrance is always accessible. + if doors is True: + room_obj.entrances.append(RoomEntrance(source_room, None, False)) + elif isinstance(doors, dict): + # If the value of an entrance is a dictionary, that means the entrance requires a door to be accessible, is a + # painting-based entrance, or both. + if "painting" in doors and "door" not in doors: + PAINTING_EXIT_ROOMS.add(room_obj.name) + PAINTING_ENTRANCES += 1 + + room_obj.entrances.append(RoomEntrance(source_room, None, True)) + else: + if "painting" in doors and doors["painting"]: + PAINTING_EXIT_ROOMS.add(room_obj.name) + PAINTING_ENTRANCES += 1 + + room_obj.entrances.append(RoomEntrance(source_room, RoomAndDoor( + doors["room"] if "room" in doors else None, + doors["door"] + ), doors["painting"] if "painting" in doors else False)) + else: + # If the value of an entrance is a list, then there are multiple possible doors that can give access to the + # entrance. + for door in doors: + if "painting" in door and door["painting"]: + PAINTING_EXIT_ROOMS.add(room_obj.name) + PAINTING_ENTRANCES += 1 + + room_obj.entrances.append(RoomEntrance(source_room, RoomAndDoor( + door["room"] if "room" in door else None, + door["door"] + ), door["painting"] if "painting" in door else False)) + + +def process_panel(room_name, panel_name, panel_data): + global PANELS, PANELS_BY_ROOM + + full_name = f"{room_name} - {panel_name}" + + # 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): + required_rooms = panel_data["required_room"] + else: + required_rooms = [panel_data["required_room"]] + else: + required_rooms = [] + + # required_door can either be a single door or a list of doors. For convenience, the room key for each door does not + # need to be specified if the door is in this room. + required_doors = list() + if "required_door" in panel_data: + if isinstance(panel_data["required_door"], dict): + door = panel_data["required_door"] + required_doors.append(RoomAndDoor( + door["room"] if "room" in door else None, + door["door"] + )) + else: + for door in panel_data["required_door"]: + required_doors.append(RoomAndDoor( + door["room"] if "room" in door else None, + door["door"] + )) + + # required_panel can either be a single panel or a list of panels. For convenience, the room key for each panel does + # not need to be specified if the panel is in this room. + required_panels = list() + if "required_panel" in panel_data: + if isinstance(panel_data["required_panel"], dict): + other_panel = panel_data["required_panel"] + required_panels.append(RoomAndPanel( + other_panel["room"] if "room" in other_panel else None, + other_panel["panel"] + )) + else: + for other_panel in panel_data["required_panel"]: + required_panels.append(RoomAndPanel( + other_panel["room"] if "room" in other_panel else None, + other_panel["panel"] + )) + + # colors can either be a single color or a list of colors. + if "colors" in panel_data: + if isinstance(panel_data["colors"], list): + colors = panel_data["colors"] + else: + colors = [panel_data["colors"]] + else: + colors = [] + + if "check" in panel_data: + check = panel_data["check"] + else: + check = False + + if "event" in panel_data: + event = panel_data["event"] + else: + event = False + + if "achievement" in panel_data: + achievement = True + else: + achievement = False + + if "exclude_reduce" in panel_data: + exclude_reduce = panel_data["exclude_reduce"] + else: + exclude_reduce = False + + if "non_counting" in panel_data: + non_counting = panel_data["non_counting"] + else: + non_counting = False + + if "id" in panel_data: + if isinstance(panel_data["id"], list): + internal_ids = panel_data["id"] + else: + internal_ids = [panel_data["id"]] + else: + internal_ids = [] + + panel_obj = Panel(required_rooms, required_doors, required_panels, colors, check, event, internal_ids, + exclude_reduce, achievement, non_counting) + PANELS[full_name] = panel_obj + PANELS_BY_ROOM[room_name][panel_name] = panel_obj + + +def process_door(room_name, door_name, door_data): + global DOORS, 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: + item_name = door_data["item_name"] + else: + item_name = f"{room_name} - {door_name}" + + if "skip_location" in door_data: + skip_location = door_data["skip_location"] + else: + skip_location = False + + if "skip_item" in door_data: + skip_item = door_data["skip_item"] + else: + skip_item = False + + if "event" in door_data: + event = door_data["event"] + else: + event = False + + if "include_reduce" in door_data: + include_reduce = door_data["include_reduce"] + else: + include_reduce = False + + if "junk_item" in door_data: + junk_item = door_data["junk_item"] + else: + junk_item = False + + if "group" in door_data: + group = door_data["group"] + else: + group = None + + # panels is a list of panels. Each panel can either be a simple string (the name of a panel in the current room) or + # a dictionary specifying a panel in a different room. + if "panels" in door_data: + panels = list() + for panel in door_data["panels"]: + if isinstance(panel, dict): + panels.append(RoomAndPanel(panel["room"], panel["panel"])) + else: + panels.append(RoomAndPanel(None, panel)) + else: + skip_location = True + panels = None + + # The location name associated with a door can be explicitly specified in the configuration. If it is not, then the + # name is generated using a combination of all of the panels that would ordinarily open the door. This can get quite + # messy if there are a lot of panels, especially if panels from multiple rooms are involved, so in these cases it + # would be better to specify a name. + if "location_name" in door_data: + location_name = door_data["location_name"] + elif skip_location is False: + panel_per_room = dict() + for panel in panels: + panel_room_name = room_name if panel.room is None else panel.room + panel_per_room.setdefault(panel_room_name, []).append(panel.panel) + + room_strs = list() + for door_room_str, door_panels_str in panel_per_room.items(): + room_strs.append(door_room_str + " - " + ", ".join(door_panels_str)) + + location_name = " and ".join(room_strs) + else: + location_name = None + + # The id field can be a single item, or a list of door IDs, in the event that the item for this logical door should + # open more than one actual in-game door. + if "id" in door_data: + if isinstance(door_data["id"], list): + door_ids = door_data["id"] + else: + door_ids = [door_data["id"]] + else: + door_ids = [] + + # The painting_id field can be a single item, or a list of painting IDs, in the event that the item for this logical + # door should move more than one actual in-game painting. + if "painting_id" in door_data: + if isinstance(door_data["painting_id"], list): + painting_ids = door_data["painting_id"] + else: + painting_ids = [door_data["painting_id"]] + else: + painting_ids = [] + + door_obj = Door(door_name, item_name, location_name, panels, skip_location, skip_item, door_ids, + painting_ids, event, group, include_reduce, junk_item) + + DOORS[door_obj.item_name] = door_obj + DOORS_BY_ROOM[room_name][door_name] = door_obj + + +def process_painting(room_name, painting_data): + global PAINTINGS, PAINTINGS_BY_ROOM, 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"] + + if "orientation" in painting_data: + orientation = painting_data["orientation"] + else: + orientation = "" + + if "disable" in painting_data: + disable_painting = painting_data["disable"] + else: + disable_painting = False + + if "required" in painting_data: + required_painting = painting_data["required"] + if required_painting: + REQUIRED_PAINTING_ROOMS.append(room_name) + else: + required_painting = False + + if "move" in painting_data: + move_painting = painting_data["move"] + else: + move_painting = False + + if "required_when_no_doors" in painting_data: + rwnd = painting_data["required_when_no_doors"] + if rwnd: + REQUIRED_PAINTING_WHEN_NO_DOORS_ROOMS.append(room_name) + else: + rwnd = False + + if "exit_only" in painting_data: + exit_only = painting_data["exit_only"] + else: + exit_only = False + + if "enter_only" in painting_data: + enter_only = painting_data["enter_only"] + else: + enter_only = False + + if "req_blocked" in painting_data: + req_blocked = painting_data["req_blocked"] + else: + req_blocked = False + + if "req_blocked_when_no_doors" in painting_data: + req_blocked_when_no_doors = painting_data["req_blocked_when_no_doors"] + else: + req_blocked_when_no_doors = False + + required_door = None + if "required_door" in painting_data: + door = painting_data["required_door"] + required_door = RoomAndDoor( + door["room"] if "room" in door else room_name, + door["door"] + ) + + painting_obj = Painting(painting_id, room_name, enter_only, exit_only, orientation, + required_painting, rwnd, required_door, disable_painting, move_painting, req_blocked, + req_blocked_when_no_doors) + PAINTINGS[painting_id] = painting_obj + PAINTINGS_BY_ROOM[room_name].append(painting_obj) + + +def process_progression(room_name, progression_name, progression_doors): + global PROGRESSIVE_ITEMS, PROGRESSION_BY_ROOM + + # Progressive items are configured as a list of doors. + PROGRESSIVE_ITEMS.append(progression_name) + + progression_index = 1 + for door in progression_doors: + if isinstance(door, Dict): + door_room = door["room"] + door_door = door["door"] + else: + door_room = room_name + door_door = door + + room_progressions = PROGRESSION_BY_ROOM.setdefault(door_room, {}) + room_progressions[door_door] = Progression(progression_name, progression_index) + progression_index += 1 + + +def process_room(room_name, room_data): + global ROOMS, ALL_ROOMS + + room_obj = Room(room_name, []) + + if "entrances" in room_data: + for source_room, doors in room_data["entrances"].items(): + process_entrance(source_room, doors, room_obj) + + if "panels" in room_data: + PANELS_BY_ROOM[room_name] = dict() + + for panel_name, panel_data in room_data["panels"].items(): + process_panel(room_name, panel_name, panel_data) + + if "doors" in room_data: + DOORS_BY_ROOM[room_name] = dict() + + for door_name, door_data in room_data["doors"].items(): + process_door(room_name, door_name, door_data) + + if "paintings" in room_data: + PAINTINGS_BY_ROOM[room_name] = [] + + for painting_data in room_data["paintings"]: + process_painting(room_name, painting_data) + + if "progression" in room_data: + for progression_name, progression_doors in room_data["progression"].items(): + process_progression(room_name, progression_name, progression_doors) + + ROOMS[room_name] = room_obj + ALL_ROOMS.append(room_obj) + + +# Initialize the static data at module scope. +load_static_data() diff --git a/worlds/lingo/test/TestDoors.py b/worlds/lingo/test/TestDoors.py new file mode 100644 index 000000000000..5dc989af5989 --- /dev/null +++ b/worlds/lingo/test/TestDoors.py @@ -0,0 +1,89 @@ +from . import LingoTestBase + + +class TestRequiredRoomLogic(LingoTestBase): + options = { + "shuffle_doors": "complex" + } + + def test_pilgrim_first(self) -> None: + self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Pilgrim Antechamber", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player)) + self.assertFalse(self.can_reach_location("The Seeker - Achievement")) + + self.collect_by_name("Pilgrim Room - Sun Painting") + self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Pilgrim Antechamber", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player)) + self.assertFalse(self.can_reach_location("The Seeker - Achievement")) + + self.collect_by_name("Pilgrim Room - Shortcut to The Seeker") + self.assertTrue(self.multiworld.state.can_reach("The Seeker", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player)) + self.assertFalse(self.can_reach_location("The Seeker - Achievement")) + + self.collect_by_name("Starting Room - Back Right Door") + self.assertTrue(self.can_reach_location("The Seeker - Achievement")) + + def test_hidden_first(self) -> None: + self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player)) + self.assertFalse(self.can_reach_location("The Seeker - Achievement")) + + self.collect_by_name("Starting Room - Back Right Door") + self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player)) + self.assertFalse(self.can_reach_location("The Seeker - Achievement")) + + self.collect_by_name("Pilgrim Room - Shortcut to The Seeker") + self.assertFalse(self.multiworld.state.can_reach("The Seeker", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player)) + self.assertFalse(self.can_reach_location("The Seeker - Achievement")) + + self.collect_by_name("Pilgrim Room - Sun Painting") + self.assertTrue(self.multiworld.state.can_reach("The Seeker", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Pilgrim Room", "Region", self.player)) + self.assertTrue(self.can_reach_location("The Seeker - Achievement")) + + +class TestRequiredDoorLogic(LingoTestBase): + options = { + "shuffle_doors": "complex" + } + + def test_through_rhyme(self) -> None: + self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall")) + + self.collect_by_name("Starting Room - Rhyme Room Entrance") + self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall")) + + self.collect_by_name("Rhyme Room (Looped Square) - Door to Circle") + self.assertTrue(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall")) + + def test_through_hidden(self) -> None: + self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall")) + + self.collect_by_name("Starting Room - Rhyme Room Entrance") + self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall")) + + self.collect_by_name("Starting Room - Back Right Door") + self.assertFalse(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall")) + + self.collect_by_name("Hidden Room - Rhyme Room Entrance") + self.assertTrue(self.can_reach_location("Rhyme Room - Circle/Looped Square Wall")) + + +class TestSimpleDoors(LingoTestBase): + options = { + "shuffle_doors": "simple" + } + + def test_requirement(self): + self.assertFalse(self.multiworld.state.can_reach("Outside The Wanderer", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + + self.collect_by_name("Rhyme Room Doors") + self.assertTrue(self.multiworld.state.can_reach("Outside The Wanderer", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + diff --git a/worlds/lingo/test/TestMastery.py b/worlds/lingo/test/TestMastery.py new file mode 100644 index 000000000000..3fb3c95a0208 --- /dev/null +++ b/worlds/lingo/test/TestMastery.py @@ -0,0 +1,39 @@ +from . import LingoTestBase + + +class TestMasteryWhenVictoryIsTheEnd(LingoTestBase): + options = { + "mastery_achievements": "22", + "victory_condition": "the_end", + "shuffle_colors": "true" + } + + def test_requirement(self): + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect_by_name(["Red", "Blue", "Black", "Purple", "Orange"]) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + self.assertTrue(self.can_reach_location("The End (Solved)")) + self.assertFalse(self.can_reach_location("Orange Tower Seventh Floor - THE MASTER")) + + self.collect_by_name(["Green", "Brown", "Yellow"]) + self.assertTrue(self.can_reach_location("Orange Tower Seventh Floor - THE MASTER")) + + +class TestMasteryWhenVictoryIsTheMaster(LingoTestBase): + options = { + "mastery_achievements": "24", + "victory_condition": "the_master", + "shuffle_colors": "true" + } + + def test_requirement(self): + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect_by_name(["Red", "Blue", "Black", "Purple", "Orange"]) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + self.assertTrue(self.can_reach_location("Orange Tower Seventh Floor - THE END")) + self.assertFalse(self.can_reach_location("Orange Tower Seventh Floor - Mastery Achievements")) + + self.collect_by_name(["Green", "Gray", "Brown", "Yellow"]) + self.assertTrue(self.can_reach_location("Orange Tower Seventh Floor - Mastery Achievements")) \ No newline at end of file diff --git a/worlds/lingo/test/TestOptions.py b/worlds/lingo/test/TestOptions.py new file mode 100644 index 000000000000..176967786243 --- /dev/null +++ b/worlds/lingo/test/TestOptions.py @@ -0,0 +1,31 @@ +from . import LingoTestBase + + +class TestMultiShuffleOptions(LingoTestBase): + options = { + "shuffle_doors": "complex", + "progressive_orange_tower": "true", + "shuffle_colors": "true", + "shuffle_paintings": "true", + "early_color_hallways": "true" + } + + +class TestPanelsanity(LingoTestBase): + options = { + "shuffle_doors": "complex", + "progressive_orange_tower": "true", + "location_checks": "insanity", + "shuffle_colors": "true" + } + + +class TestAllPanelHunt(LingoTestBase): + options = { + "shuffle_doors": "complex", + "progressive_orange_tower": "true", + "shuffle_colors": "true", + "victory_condition": "level_2", + "level_2_requirement": "800", + "early_color_hallways": "true" + } diff --git a/worlds/lingo/test/TestOrangeTower.py b/worlds/lingo/test/TestOrangeTower.py new file mode 100644 index 000000000000..7b0c3bb52518 --- /dev/null +++ b/worlds/lingo/test/TestOrangeTower.py @@ -0,0 +1,175 @@ +from . import LingoTestBase + + +class TestProgressiveOrangeTower(LingoTestBase): + options = { + "shuffle_doors": "complex", + "progressive_orange_tower": "true" + } + + def test_from_welcome_back(self) -> None: + self.assertFalse(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect_by_name("Welcome Back Area - Shortcut to Starting Room") + self.collect_by_name("Orange Tower Fifth Floor - Welcome Back") + self.assertFalse(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + progressive_tower = self.get_items_by_name("Progressive Orange Tower") + + self.collect(progressive_tower[0]) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect(progressive_tower[1]) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect(progressive_tower[2]) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect(progressive_tower[3]) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect(progressive_tower[4]) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect(progressive_tower[5]) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + def test_from_hub_room(self) -> None: + self.assertFalse(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect_by_name("Second Room - Exit Door") + self.assertFalse(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect_by_name("Orange Tower First Floor - Shortcut to Hub Room") + self.assertTrue(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + progressive_tower = self.get_items_by_name("Progressive Orange Tower") + + self.collect(progressive_tower[0]) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.remove(self.get_item_by_name("Orange Tower First Floor - Shortcut to Hub Room")) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect(progressive_tower[1]) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect(progressive_tower[2]) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect(progressive_tower[3]) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect(progressive_tower[4]) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) + + self.collect(progressive_tower[5]) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower First Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Second Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Third Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fourth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Sixth Floor", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Seventh Floor", "Region", self.player)) diff --git a/worlds/lingo/test/TestProgressive.py b/worlds/lingo/test/TestProgressive.py new file mode 100644 index 000000000000..026971c45d65 --- /dev/null +++ b/worlds/lingo/test/TestProgressive.py @@ -0,0 +1,191 @@ +from . import LingoTestBase + + +class TestComplexProgressiveHallwayRoom(LingoTestBase): + options = { + "shuffle_doors": "complex" + } + + def test_item(self): + self.assertFalse(self.multiworld.state.can_reach("Outside The Agreeable", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (2)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (3)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (4)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Elements Area", "Region", self.player)) + + self.collect_by_name(["Second Room - Exit Door", "The Tenacious - Shortcut to Hub Room", + "Outside The Agreeable - Tenacious Entrance"]) + self.assertTrue(self.multiworld.state.can_reach("Outside The Agreeable", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (2)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (3)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (4)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Elements Area", "Region", self.player)) + + progressive_hallway_room = self.get_items_by_name("Progressive Hallway Room") + + self.collect(progressive_hallway_room[0]) + self.assertTrue(self.multiworld.state.can_reach("Outside The Agreeable", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (2)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (3)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (4)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Elements Area", "Region", self.player)) + + self.collect(progressive_hallway_room[1]) + self.assertTrue(self.multiworld.state.can_reach("Outside The Agreeable", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (2)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (3)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (4)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Elements Area", "Region", self.player)) + + self.collect(progressive_hallway_room[2]) + self.assertTrue(self.multiworld.state.can_reach("Outside The Agreeable", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (2)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (3)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (4)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Elements Area", "Region", self.player)) + + self.collect(progressive_hallway_room[3]) + self.assertTrue(self.multiworld.state.can_reach("Outside The Agreeable", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (2)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (3)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (4)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Elements Area", "Region", self.player)) + + +class TestSimpleHallwayRoom(LingoTestBase): + options = { + "shuffle_doors": "simple" + } + + def test_item(self): + self.assertFalse(self.multiworld.state.can_reach("Outside The Agreeable", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (2)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (3)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (4)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Elements Area", "Region", self.player)) + + self.collect_by_name(["Second Room - Exit Door", "Entrances to The Tenacious"]) + self.assertTrue(self.multiworld.state.can_reach("Outside The Agreeable", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (2)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (3)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Hallway Room (4)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Elements Area", "Region", self.player)) + + self.collect_by_name("Hallway Room Doors") + self.assertTrue(self.multiworld.state.can_reach("Outside The Agreeable", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (2)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (3)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Hallway Room (4)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Elements Area", "Region", self.player)) + + +class TestProgressiveArtGallery(LingoTestBase): + options = { + "shuffle_doors": "complex" + } + + def test_item(self): + self.assertFalse(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertFalse(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + + self.collect_by_name(["Second Room - Exit Door", "Crossroads - Tower Entrance", + "Orange Tower Fourth Floor - Hot Crusts Door"]) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertFalse(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + + progressive_gallery_room = self.get_items_by_name("Progressive Art Gallery") + + self.collect(progressive_gallery_room[0]) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertFalse(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + + self.collect(progressive_gallery_room[1]) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertFalse(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + + self.collect(progressive_gallery_room[2]) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertFalse(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + + self.collect(progressive_gallery_room[3]) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertTrue(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + + self.collect(progressive_gallery_room[4]) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertTrue(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + + +class TestNoDoorsArtGallery(LingoTestBase): + options = { + "shuffle_doors": "none", + "shuffle_colors": "true" + } + + def test_item(self): + self.assertFalse(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertFalse(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + + self.collect_by_name("Yellow") + self.assertTrue(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertFalse(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + + self.collect_by_name("Brown") + self.assertTrue(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertFalse(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertFalse(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + + self.collect_by_name("Blue") + self.assertTrue(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertFalse(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertFalse(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) + + self.collect_by_name(["Orange", "Gray"]) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Second Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Third Floor)", "Region", self.player)) + self.assertTrue(self.multiworld.state.can_reach("Art Gallery (Fourth Floor)", "Region", self.player)) + self.assertTrue(self.can_reach_location("Art Gallery - ONE ROAD MANY TURNS")) + self.assertTrue(self.multiworld.state.can_reach("Orange Tower Fifth Floor", "Region", self.player)) diff --git a/worlds/lingo/test/__init__.py b/worlds/lingo/test/__init__.py new file mode 100644 index 000000000000..ffbf9032b64a --- /dev/null +++ b/worlds/lingo/test/__init__.py @@ -0,0 +1,13 @@ +from typing import ClassVar + +from test.bases import WorldTestBase +from .. import LingoTestOptions + + +class LingoTestBase(WorldTestBase): + game = "Lingo" + player: ClassVar[int] = 1 + + def world_setup(self, *args, **kwargs): + LingoTestOptions.disable_forced_good_item = True + super().world_setup(*args, **kwargs) diff --git a/worlds/lingo/testing.py b/worlds/lingo/testing.py new file mode 100644 index 000000000000..22fafea0fc6a --- /dev/null +++ b/worlds/lingo/testing.py @@ -0,0 +1,2 @@ +class LingoTestOptions: + disable_forced_good_item: bool = False diff --git a/worlds/lingo/utils/assign_ids.rb b/worlds/lingo/utils/assign_ids.rb new file mode 100644 index 000000000000..9e1ce67bd2db --- /dev/null +++ b/worlds/lingo/utils/assign_ids.rb @@ -0,0 +1,178 @@ +# This utility goes through the provided Lingo config and assigns item and +# location IDs to entities that require them (such as doors and panels). These +# IDs are output in a separate yaml file. If the output file already exists, +# then it will be updated with any newly assigned IDs rather than overwritten. +# In this event, all new IDs will be greater than any already existing IDs, +# even if there are gaps in the ID space; this is to prevent collision when IDs +# are retired. +# +# This utility should be run whenever logically new items or locations are +# required. If an item or location is created that is logically equivalent to +# one that used to exist, this utility should not be used, and instead the ID +# file should be manually edited so that the old ID can be reused. + +require 'set' +require 'yaml' + +configpath = ARGV[0] +outputpath = ARGV[1] + +next_item_id = 444400 +next_location_id = 444400 + +location_id_by_name = {} + +old_generated = YAML.load_file(outputpath) +File.write(outputpath + ".old", old_generated.to_yaml) + +if old_generated.include? "special_items" then + old_generated["special_items"].each do |name, id| + if id >= next_item_id then + next_item_id = id + 1 + end + end +end +if old_generated.include? "special_locations" then + old_generated["special_locations"].each do |name, id| + if id >= next_location_id then + next_location_id = id + 1 + end + end +end +if old_generated.include? "panels" then + old_generated["panels"].each do |room, panels| + panels.each do |name, id| + if id >= next_location_id then + next_location_id = id + 1 + end + location_name = "#{room} - #{name}" + location_id_by_name[location_name] = id + end + end +end +if old_generated.include? "doors" then + old_generated["doors"].each do |room, doors| + doors.each do |name, ids| + if ids.include? "location" then + if ids["location"] >= next_location_id then + next_location_id = ids["location"] + 1 + end + end + if ids.include? "item" then + if ids["item"] >= next_item_id then + next_item_id = ids["item"] + 1 + end + end + end + end +end +if old_generated.include? "door_groups" then + old_generated["door_groups"].each do |name, id| + if id >= next_item_id then + next_item_id = id + 1 + end + end +end +if old_generated.include? "progression" then + old_generated["progression"].each do |name, id| + if id >= next_item_id then + next_item_id = id + 1 + end + end +end + +door_groups = Set[] + +config = YAML.load_file(configpath) +config.each do |room_name, room_data| + if room_data.include? "panels" + room_data["panels"].each do |panel_name, panel| + unless old_generated.include? "panels" and old_generated["panels"].include? room_name and old_generated["panels"][room_name].include? panel_name then + old_generated["panels"] ||= {} + old_generated["panels"][room_name] ||= {} + old_generated["panels"][room_name][panel_name] = next_location_id + + location_name = "#{room_name} - #{panel_name}" + location_id_by_name[location_name] = next_location_id + + next_location_id += 1 + end + end + end +end + +config.each do |room_name, room_data| + if room_data.include? "doors" + room_data["doors"].each do |door_name, door| + if door.include? "event" and door["event"] then + next + end + + unless door.include? "skip_item" and door["skip_item"] then + unless old_generated.include? "doors" and old_generated["doors"].include? room_name and old_generated["doors"][room_name].include? door_name and old_generated["doors"][room_name][door_name].include? "item" then + old_generated["doors"] ||= {} + old_generated["doors"][room_name] ||= {} + old_generated["doors"][room_name][door_name] ||= {} + old_generated["doors"][room_name][door_name]["item"] = next_item_id + + next_item_id += 1 + end + + if door.include? "group" and not door_groups.include? door["group"] then + door_groups.add(door["group"]) + + unless old_generated.include? "door_groups" and old_generated["door_groups"].include? door["group"] then + old_generated["door_groups"] ||= {} + old_generated["door_groups"][door["group"]] = next_item_id + + next_item_id += 1 + end + end + end + + unless door.include? "skip_location" and door["skip_location"] then + location_name = "" + if door.include? "location_name" then + location_name = door["location_name"] + elsif door.include? "panels" then + location_name = door["panels"].map do |panel| + if panel.kind_of? Hash then + panel + else + {"room" => room_name, "panel" => panel} + end + end.sort_by {|panel| panel["room"]}.chunk {|panel| panel["room"]}.map do |room_panels| + room_panels[0] + " - " + room_panels[1].map{|panel| panel["panel"]}.join(", ") + end.join(" and ") + end + + if location_id_by_name.has_key? location_name then + old_generated["doors"] ||= {} + old_generated["doors"][room_name] ||= {} + old_generated["doors"][room_name][door_name] ||= {} + old_generated["doors"][room_name][door_name]["location"] = location_id_by_name[location_name] + elsif not (old_generated.include? "doors" and old_generated["doors"].include? room_name and old_generated["doors"][room_name].include? door_name and old_generated["doors"][room_name][door_name].include? "location") then + old_generated["doors"] ||= {} + old_generated["doors"][room_name] ||= {} + old_generated["doors"][room_name][door_name] ||= {} + old_generated["doors"][room_name][door_name]["location"] = next_location_id + + next_location_id += 1 + end + end + end + end + + if room_data.include? "progression" + room_data["progression"].each do |progression_name, pdata| + unless old_generated.include? "progression" and old_generated["progression"].include? progression_name then + old_generated["progression"] ||= {} + old_generated["progression"][progression_name] = next_item_id + + next_item_id += 1 + end + end + end +end + +File.write(outputpath, old_generated.to_yaml) diff --git a/worlds/lingo/utils/validate_config.rb b/worlds/lingo/utils/validate_config.rb new file mode 100644 index 000000000000..bed5188e3163 --- /dev/null +++ b/worlds/lingo/utils/validate_config.rb @@ -0,0 +1,329 @@ +# Script to validate a level config file. This checks that the names used within +# the file are consistent. It also checks that the panel and door IDs mentioned +# all exist in the map file. +# +# Usage: validate_config.rb [config file] [map file] + +require 'set' +require 'yaml' + +configpath = ARGV[0] +mappath = ARGV[1] + +panels = Set["Countdown Panels/Panel_1234567890_wanderlust"] +doors = Set["Naps Room Doors/Door_hider_new1", "Tower Room Area Doors/Door_wanderer_entrance"] +paintings = Set[] + +File.readlines(mappath).each do |line| + line.match(/node name=\"(.*)\" parent=\"Panels\/(.*)\" instance/) do |m| + panels.add(m[2] + "/" + m[1]) + end + line.match(/node name=\"(.*)\" parent=\"Doors\/(.*)\" instance/) do |m| + doors.add(m[2] + "/" + m[1]) + end + line.match(/node name=\"(.*)\" parent=\"Decorations\/Paintings\" instance/) do |m| + paintings.add(m[1]) + end + line.match(/node name=\"(.*)\" parent=\"Decorations\/EndPanel\" instance/) do |m| + panels.add("EndPanel/" + m[1]) + end +end + +configured_rooms = Set["Menu"] +configured_doors = Set[] +configured_panels = Set[] + +mentioned_rooms = Set[] +mentioned_doors = Set[] +mentioned_panels = Set[] + +door_groups = {} + +directives = Set["entrances", "panels", "doors", "paintings", "progression"] +panel_directives = Set["id", "required_room", "required_door", "required_panel", "colors", "check", "exclude_reduce", "tag", "link", "subtag", "achievement", "copy_to_sign", "non_counting"] +door_directives = Set["id", "painting_id", "panels", "item_name", "location_name", "skip_location", "skip_item", "group", "include_reduce", "junk_item", "event"] +painting_directives = Set["id", "enter_only", "exit_only", "orientation", "required_door", "required", "required_when_no_doors", "move", "req_blocked", "req_blocked_when_no_doors"] + +non_counting = 0 + +config = YAML.load_file(configpath) +config.each do |room_name, room| + configured_rooms.add(room_name) + + used_directives = Set[] + room.each_key do |key| + used_directives.add(key) + end + diff_directives = used_directives - directives + unless diff_directives.empty? then + puts("#{room_name} has the following invalid top-level directives: #{diff_directives.to_s}") + end + + (room["entrances"] || {}).each do |source_room, entrance| + mentioned_rooms.add(source_room) + + entrances = [] + if entrance.kind_of? Hash + if entrance.keys() != ["painting"] then + entrances = [entrance] + end + elsif entrance.kind_of? Array + entrances = entrance + end + + entrances.each do |e| + entrance_room = e.include?("room") ? e["room"] : room_name + mentioned_rooms.add(entrance_room) + mentioned_doors.add(entrance_room + " - " + e["door"]) + end + end + + (room["panels"] || {}).each do |panel_name, panel| + unless panel_name.kind_of? String then + puts "#{room_name} has an invalid panel name" + end + + configured_panels.add(room_name + " - " + panel_name) + + if panel.include?("id") + panel_ids = [] + if panel["id"].kind_of? Array + panel_ids = panel["id"] + else + panel_ids = [panel["id"]] + end + + panel_ids.each do |panel_id| + unless panels.include? panel_id then + puts "#{room_name} - #{panel_name} :::: Invalid Panel ID #{panel_id}" + end + end + else + puts "#{room_name} - #{panel_name} :::: Panel is missing an ID" + end + + if panel.include?("required_room") + required_rooms = [] + if panel["required_room"].kind_of? Array + required_rooms = panel["required_room"] + else + required_rooms = [panel["required_room"]] + end + + required_rooms.each do |required_room| + mentioned_rooms.add(required_room) + end + end + + if panel.include?("required_door") + required_doors = [] + if panel["required_door"].kind_of? Array + required_doors = panel["required_door"] + else + required_doors = [panel["required_door"]] + end + + required_doors.each do |required_door| + other_room = required_door.include?("room") ? required_door["room"] : room_name + mentioned_rooms.add(other_room) + mentioned_doors.add("#{other_room} - #{required_door["door"]}") + end + end + + if panel.include?("required_panel") + required_panels = [] + if panel["required_panel"].kind_of? Array + required_panels = panel["required_panel"] + else + required_panels = [panel["required_panel"]] + end + + required_panels.each do |required_panel| + other_room = required_panel.include?("room") ? required_panel["room"] : room_name + mentioned_rooms.add(other_room) + mentioned_panels.add("#{other_room} - #{required_panel["panel"]}") + end + end + + unless panel.include?("tag") then + puts "#{room_name} - #{panel_name} :::: Panel is missing a tag" + end + + if panel.include?("non_counting") then + non_counting += 1 + end + + bad_subdirectives = [] + panel.keys.each do |key| + unless panel_directives.include?(key) then + bad_subdirectives << key + end + end + unless bad_subdirectives.empty? then + puts "#{room_name} - #{panel_name} :::: Panel has the following invalid subdirectives: #{bad_subdirectives.join(", ")}" + end + end + + (room["doors"] || {}).each do |door_name, door| + configured_doors.add("#{room_name} - #{door_name}") + + if door.include?("id") + door_ids = [] + if door["id"].kind_of? Array + door_ids = door["id"] + else + door_ids = [door["id"]] + end + + door_ids.each do |door_id| + unless doors.include? door_id then + puts "#{room_name} - #{door_name} :::: Invalid Door ID #{door_id}" + end + end + end + + if door.include?("painting_id") + painting_ids = [] + if door["painting_id"].kind_of? Array + painting_ids = door["painting_id"] + else + painting_ids = [door["painting_id"]] + end + + painting_ids.each do |painting_id| + unless paintings.include? painting_id then + puts "#{room_name} - #{door_name} :::: Invalid Painting ID #{painting_id}" + end + end + end + + if not door.include?("id") and not door.include?("painting_id") and not door["skip_item"] and not door["event"] then + puts "#{room_name} - #{door_name} :::: Should be marked skip_item or event if there are no doors or paintings" + end + + if door.include?("panels") + door["panels"].each do |panel| + if panel.kind_of? Hash then + other_room = panel.include?("room") ? panel["room"] : room_name + mentioned_panels.add("#{other_room} - #{panel["panel"]}") + else + other_room = panel.include?("room") ? panel["room"] : room_name + mentioned_panels.add("#{room_name} - #{panel}") + end + end + elsif not door["skip_location"] + puts "#{room_name} - #{door_name} :::: Should be marked skip_location if there are no panels" + end + + if door.include?("group") + door_groups[door["group"]] ||= 0 + door_groups[door["group"]] += 1 + end + + bad_subdirectives = [] + door.keys.each do |key| + unless door_directives.include?(key) then + bad_subdirectives << key + end + end + unless bad_subdirectives.empty? then + puts "#{room_name} - #{door_name} :::: Door has the following invalid subdirectives: #{bad_subdirectives.join(", ")}" + end + end + + (room["paintings"] || []).each do |painting| + if painting.include?("id") and painting["id"].kind_of? String then + unless paintings.include? painting["id"] then + puts "#{room_name} :::: Invalid Painting ID #{painting["id"]}" + end + else + puts "#{room_name} :::: Painting is missing an ID" + end + + if painting["disable"] then + # We're good. + next + end + + if painting.include?("orientation") then + unless ["north", "south", "east", "west"].include? painting["orientation"] then + puts "#{room_name} - #{painting["id"] || "painting"} :::: Invalid orientation #{painting["orientation"]}" + end + else + puts "#{room_name} :::: Painting is missing an orientation" + end + + if painting.include?("required_door") + other_room = painting["required_door"].include?("room") ? painting["required_door"]["room"] : room_name + mentioned_doors.add("#{other_room} - #{painting["required_door"]["door"]}") + + unless painting["enter_only"] then + puts "#{room_name} - #{painting["id"] || "painting"} :::: Should be marked enter_only if there is a required_door" + end + end + + bad_subdirectives = [] + painting.keys.each do |key| + unless painting_directives.include?(key) then + bad_subdirectives << key + end + end + unless bad_subdirectives.empty? then + puts "#{room_name} - #{painting["id"] || "painting"} :::: Painting has the following invalid subdirectives: #{bad_subdirectives.join(", ")}" + end + end + + (room["progression"] || {}).each do |progression_name, door_list| + door_list.each do |door| + if door.kind_of? Hash then + mentioned_doors.add("#{door["room"]} - #{door["door"]}") + else + mentioned_doors.add("#{room_name} - #{door}") + end + end + end +end + +errored_rooms = mentioned_rooms - configured_rooms +unless errored_rooms.empty? then + puts "The folloring rooms are mentioned but do not exist: " + errored_rooms.to_s +end + +errored_panels = mentioned_panels - configured_panels +unless errored_panels.empty? then + puts "The folloring panels are mentioned but do not exist: " + errored_panels.to_s +end + +errored_doors = mentioned_doors - configured_doors +unless errored_doors.empty? then + puts "The folloring doors are mentioned but do not exist: " + errored_doors.to_s +end + +door_groups.each do |group,num| + if num == 1 then + puts "Door group \"#{group}\" only has one door in it" + end +end + +slashed_rooms = configured_rooms.select do |room| + room.include? "/" +end +unless slashed_rooms.empty? then + puts "The following rooms have slashes in their names: " + slashed_rooms.to_s +end + +slashed_panels = configured_panels.select do |panel| + panel.include? "/" +end +unless slashed_panels.empty? then + puts "The following panels have slashes in their names: " + slashed_panels.to_s +end + +slashed_doors = configured_doors.select do |door| + door.include? "/" +end +unless slashed_doors.empty? then + puts "The following doors have slashes in their names: " + slashed_doors.to_s +end + +puts "#{configured_panels.size} panels (#{non_counting} non counting)" diff --git a/worlds/lufia2ac/__init__.py b/worlds/lufia2ac/__init__.py index acb988daaf82..8f9b8d58231a 100644 --- a/worlds/lufia2ac/__init__.py +++ b/worlds/lufia2ac/__init__.py @@ -9,7 +9,7 @@ from Options import PerGameCommonOptions from Utils import __version__ from worlds.AutoWorld import WebWorld, World -from worlds.generic.Rules import add_rule, set_rule +from worlds.generic.Rules import add_rule, CollectionRule, set_rule from .Client import L2ACSNIClient # noqa: F401 from .Items import ItemData, ItemType, l2ac_item_name_to_id, l2ac_item_table, L2ACItem, start_id as items_start_id from .Locations import l2ac_location_name_to_id, L2ACLocation @@ -117,6 +117,7 @@ def create_regions(self) -> None: L2ACLocation(self.player, f"Chest access {i + 1}-{i + CHESTS_PER_SPHERE}", None, ancient_dungeon) chest_access.place_locked_item( L2ACItem("Progressive chest access", ItemClassification.progression, None, self.player)) + chest_access.show_in_spoiler = False ancient_dungeon.locations.append(chest_access) for iris in self.item_name_groups["Iris treasures"]: treasure_name: str = f"Iris treasure {self.item_name_to_id[iris] - self.item_name_to_id['Iris sword'] + 1}" @@ -153,23 +154,23 @@ def create_items(self) -> None: self.multiworld.itempool.append(self.create_item(item_name)) def set_rules(self) -> None: - for i in range(1, self.o.blue_chest_count): - if i % CHESTS_PER_SPHERE == 0: - set_rule(self.multiworld.get_location(f"Blue chest {i + 1}", self.player), - lambda state, j=i: state.has("Progressive chest access", self.player, j // CHESTS_PER_SPHERE)) - set_rule(self.multiworld.get_location(f"Chest access {i + 1}-{i + CHESTS_PER_SPHERE}", self.player), - lambda state, j=i: state.can_reach(f"Blue chest {j}", "Location", self.player)) - else: - set_rule(self.multiworld.get_location(f"Blue chest {i + 1}", self.player), - lambda state, j=i: state.can_reach(f"Blue chest {j}", "Location", self.player)) - - set_rule(self.multiworld.get_entrance("FinalFloorEntrance", self.player), - lambda state: state.can_reach(f"Blue chest {self.o.blue_chest_count}", "Location", self.player)) + max_sphere: int = (self.o.blue_chest_count - 1) // CHESTS_PER_SPHERE + 1 + rule_for_sphere: Dict[int, CollectionRule] = \ + {sphere: lambda state, s=sphere: state.has("Progressive chest access", self.player, s - 1) + for sphere in range(2, max_sphere + 1)} + + for i in range(CHESTS_PER_SPHERE * 2, self.o.blue_chest_count, CHESTS_PER_SPHERE): + set_rule(self.multiworld.get_location(f"Chest access {i + 1}-{i + CHESTS_PER_SPHERE}", self.player), + rule_for_sphere[i // CHESTS_PER_SPHERE]) + for i in range(CHESTS_PER_SPHERE, self.o.blue_chest_count): + set_rule(self.multiworld.get_location(f"Blue chest {i + 1}", self.player), + rule_for_sphere[i // CHESTS_PER_SPHERE + 1]) + + set_rule(self.multiworld.get_entrance("FinalFloorEntrance", self.player), rule_for_sphere[max_sphere]) for i in range(9): - set_rule(self.multiworld.get_location(f"Iris treasure {i + 1}", self.player), - lambda state: state.can_reach(f"Blue chest {self.o.blue_chest_count}", "Location", self.player)) - set_rule(self.multiworld.get_location("Boss", self.player), - lambda state: state.can_reach(f"Blue chest {self.o.blue_chest_count}", "Location", self.player)) + set_rule(self.multiworld.get_location(f"Iris treasure {i + 1}", self.player), rule_for_sphere[max_sphere]) + set_rule(self.multiworld.get_location("Boss", self.player), rule_for_sphere[max_sphere]) + if self.o.shuffle_capsule_monsters: add_rule(self.multiworld.get_location("Boss", self.player), lambda state: state.has("DARBI", self.player)) if self.o.shuffle_party_members: diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index 3fe13a3cb421..304b43cf5316 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -82,7 +82,10 @@ def generate_early(self) -> None: self.shop_prices, self.figurine_prices = shuffle_shop_prices(self) def create_regions(self) -> None: - self.multiworld.regions += [MessengerRegion(reg_name, self) for reg_name in REGIONS] + # MessengerRegion adds itself to the multiworld + for region in [MessengerRegion(reg_name, self) for reg_name in REGIONS]: + if region.name in REGION_CONNECTIONS: + region.add_exits(REGION_CONNECTIONS[region.name]) def create_items(self) -> None: # create items that are always in the item pool @@ -136,8 +139,6 @@ def create_items(self) -> None: self.multiworld.itempool += itempool def set_rules(self) -> None: - for reg_name, connections in REGION_CONNECTIONS.items(): - self.multiworld.get_region(reg_name, self.player).add_exits(connections) logic = self.options.logic_level if logic == Logic.option_normal: MessengerRules(self).set_messenger_rules() diff --git a/worlds/messenger/regions.py b/worlds/messenger/regions.py index 28750b949ede..3a6c95bff5a2 100644 --- a/worlds/messenger/regions.py +++ b/worlds/messenger/regions.py @@ -68,7 +68,6 @@ "Quillshroom Marsh": ["Quillshroom Marsh Mega Shard"], "Searing Crags Upper": ["Searing Crags Mega Shard"], "Glacial Peak": ["Glacial Peak Mega Shard"], - "Tower of Time": [], "Cloud Ruins": ["Cloud Entrance Mega Shard", "Time Warp Mega Shard"], "Cloud Ruins Right": ["Money Farm Room Mega Shard 1", "Money Farm Room Mega Shard 2"], "Underworld": ["Under Entrance Mega Shard", "Hot Tub Mega Shard", "Projectile Pit Mega Shard"], @@ -84,8 +83,6 @@ "Menu": {"Tower HQ"}, "Tower HQ": {"Autumn Hills", "Howling Grotto", "Searing Crags", "Glacial Peak", "Tower of Time", "Riviere Turquoise Entrance", "Sunken Shrine", "Corrupted Future", "The Shop", "Music Box"}, - "Tower of Time": set(), - "Ninja Village": set(), "Autumn Hills": {"Ninja Village", "Forlorn Temple", "Catacombs"}, "Forlorn Temple": {"Catacombs", "Bamboo Creek"}, "Catacombs": {"Autumn Hills", "Bamboo Creek", "Dark Cave"}, @@ -97,11 +94,8 @@ "Glacial Peak": {"Searing Crags Upper", "Tower HQ", "Cloud Ruins", "Elemental Skylands"}, "Cloud Ruins": {"Cloud Ruins Right"}, "Cloud Ruins Right": {"Underworld"}, - "Underworld": set(), "Dark Cave": {"Catacombs", "Riviere Turquoise Entrance"}, "Riviere Turquoise Entrance": {"Riviere Turquoise"}, - "Riviere Turquoise": set(), "Sunken Shrine": {"Howling Grotto"}, - "Elemental Skylands": set(), } """Vanilla layout mapping with all Tower HQ portals open. from -> to""" diff --git a/worlds/messenger/rules.py b/worlds/messenger/rules.py index c9bd9b86253d..876acd42c108 100644 --- a/worlds/messenger/rules.py +++ b/worlds/messenger/rules.py @@ -1,10 +1,9 @@ from typing import Callable, Dict, TYPE_CHECKING from BaseClasses import CollectionState -from worlds.generic.Rules import add_rule, allow_self_locking_items, set_rule +from worlds.generic.Rules import add_rule, allow_self_locking_items from .constants import NOTES, PHOBEKINS -from .options import Goal, MessengerAccessibility -from .subclasses import MessengerShopLocation +from .options import MessengerAccessibility if TYPE_CHECKING: from . import MessengerWorld @@ -37,7 +36,9 @@ def __init__(self, world: MessengerWorld) -> None: "Forlorn Temple": lambda state: state.has_all({"Wingsuit", *PHOBEKINS}, self.player) and self.can_dboost(state), "Glacial Peak": self.has_vertical, "Elemental Skylands": lambda state: state.has("Magic Firefly", self.player) and self.has_wingsuit(state), - "Music Box": lambda state: state.has_all(set(NOTES), self.player) and self.has_dart(state), + "Music Box": lambda state: (state.has_all(set(NOTES), self.player) + or state.has("Power Seal", self.player, max(1, self.world.required_seals))) + and self.has_dart(state), } self.location_rules = { @@ -92,8 +93,6 @@ def __init__(self, world: MessengerWorld) -> None: # corrupted future "Corrupted Future - Key of Courage": lambda state: state.has_all({"Demon King Crown", "Magic Firefly"}, self.player), - # the shop - "Shop Chest": self.has_enough_seals, # tower hq "Money Wrench": self.can_shop, } @@ -143,14 +142,11 @@ def set_messenger_rules(self) -> None: if loc.name in self.location_rules: loc.access_rule = self.location_rules[loc.name] if region.name == "The Shop": - for loc in [location for location in region.locations if isinstance(location, MessengerShopLocation)]: + for loc in region.locations: loc.access_rule = loc.can_afford - if self.world.options.goal == Goal.option_power_seal_hunt: - set_rule(multiworld.get_entrance("Tower HQ -> Music Box", self.player), - lambda state: state.has("Shop Chest", self.player)) multiworld.completion_condition[self.player] = lambda state: state.has("Rescue Phantom", self.player) - if multiworld.accessibility[self.player] > MessengerAccessibility.option_locations: + if multiworld.accessibility[self.player]: # not locations accessibility set_self_locking_items(self.world, self.player) @@ -201,8 +197,7 @@ def __init__(self, world: MessengerWorld) -> None: self.extra_rules = { "Searing Crags - Key of Strength": lambda state: self.has_dart(state) or self.has_windmill(state), "Elemental Skylands - Key of Symbiosis": lambda state: self.has_windmill(state) or self.can_dboost(state), - "Autumn Hills Seal - Spike Ball Darts": lambda state: (self.has_dart(state) and self.has_windmill(state)) - or self.has_wingsuit(state), + "Autumn Hills Seal - Spike Ball Darts": lambda state: self.has_dart(state) or self.has_windmill(state), "Underworld Seal - Fireball Wave": self.has_windmill, } diff --git a/worlds/messenger/subclasses.py b/worlds/messenger/subclasses.py index ce31d43d60b0..0c04bc015c35 100644 --- a/worlds/messenger/subclasses.py +++ b/worlds/messenger/subclasses.py @@ -17,8 +17,6 @@ def __init__(self, name: str, world: "MessengerWorld") -> None: super().__init__(name, world.player, world.multiworld) locations = [loc for loc in REGIONS[self.name]] if self.name == "The Shop": - if world.options.goal > Goal.option_open_music_box: - locations.append("Shop Chest") shop_locations = {f"The Shop - {shop_loc}": world.location_name_to_id[f"The Shop - {shop_loc}"] for shop_loc in SHOP_ITEMS} shop_locations.update(**{figurine: world.location_name_to_id[figurine] for figurine in FIGURINES}) @@ -29,9 +27,9 @@ def __init__(self, name: str, world: "MessengerWorld") -> None: locations += [seal_loc for seal_loc in SEALS[self.name]] if world.options.shuffle_shards and self.name in MEGA_SHARDS: locations += [shard for shard in MEGA_SHARDS[self.name]] - loc_dict = {loc: world.location_name_to_id[loc] if loc in world.location_name_to_id else None - for loc in locations} + loc_dict = {loc: world.location_name_to_id.get(loc, None) for loc in locations} self.add_locations(loc_dict, MessengerLocation) + world.multiworld.regions.append(self) class MessengerLocation(Location): diff --git a/worlds/messenger/test/test_shop_chest.py b/worlds/messenger/test/test_shop_chest.py index 058a2004478e..a34fa0fb96c0 100644 --- a/worlds/messenger/test/test_shop_chest.py +++ b/worlds/messenger/test/test_shop_chest.py @@ -17,18 +17,18 @@ def test_chest_access(self) -> None: with self.subTest("Access Dependency"): self.assertEqual(len([seal for seal in self.multiworld.itempool if seal.name == "Power Seal"]), self.multiworld.total_seals[self.player]) - locations = ["Shop Chest"] + locations = ["Rescue Phantom"] items = [["Power Seal"]] self.assertAccessDependency(locations, items) self.multiworld.state = CollectionState(self.multiworld) - self.assertEqual(self.can_reach_location("Shop Chest"), False) + self.assertEqual(self.can_reach_location("Rescue Phantom"), False) self.assertBeatable(False) - self.collect_all_but(["Power Seal", "Shop Chest", "Rescue Phantom"]) - self.assertEqual(self.can_reach_location("Shop Chest"), False) + self.collect_all_but(["Power Seal", "Rescue Phantom"]) + self.assertEqual(self.can_reach_location("Rescue Phantom"), False) self.assertBeatable(False) self.collect_by_name("Power Seal") - self.assertEqual(self.can_reach_location("Shop Chest"), True) + self.assertEqual(self.can_reach_location("Rescue Phantom"), True) self.assertBeatable(True) diff --git a/worlds/musedash/MuseDashCollection.py b/worlds/musedash/MuseDashCollection.py index 1807dce2f937..55523542d7df 100644 --- a/worlds/musedash/MuseDashCollection.py +++ b/worlds/musedash/MuseDashCollection.py @@ -44,8 +44,8 @@ class MuseDashCollections: vfx_trap_items: Dict[str, int] = { "Bad Apple Trap": STARTING_CODE + 1, "Pixelate Trap": STARTING_CODE + 2, - "Random Wave Trap": STARTING_CODE + 3, - "Shadow Edge Trap": STARTING_CODE + 4, + "Ripple Trap": STARTING_CODE + 3, + "Vignette Trap": STARTING_CODE + 4, "Chromatic Aberration Trap": STARTING_CODE + 5, "Background Freeze Trap": STARTING_CODE + 6, "Gray Scale Trap": STARTING_CODE + 7, diff --git a/worlds/musedash/__init__.py b/worlds/musedash/__init__.py index bfe321b64afe..9a0e473494ad 100644 --- a/worlds/musedash/__init__.py +++ b/worlds/musedash/__init__.py @@ -48,8 +48,9 @@ class MuseDashWorld(World): # World Options game = "Muse Dash" options_dataclass: ClassVar[Type[PerGameCommonOptions]] = MuseDashOptions + options: MuseDashOptions + topology_present = False - data_version = 11 web = MuseDashWebWorld() # Necessary Data diff --git a/worlds/pokemon_emerald/LICENSE b/worlds/pokemon_emerald/LICENSE new file mode 100644 index 000000000000..30b4f413fe4c --- /dev/null +++ b/worlds/pokemon_emerald/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2023 Zunawe + +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. diff --git a/worlds/pokemon_emerald/README.md b/worlds/pokemon_emerald/README.md new file mode 100644 index 000000000000..61aee774525f --- /dev/null +++ b/worlds/pokemon_emerald/README.md @@ -0,0 +1,58 @@ +# Pokemon Emerald + +Version 1.2.0 + +This README contains general info useful for understanding the world. Pretty much all the long lists of locations, +regions, and items are stored in `data/` and (mostly) loaded in by `data.py`. Access rules are in `rules.py`. Check +[data/README.md](data/README.md) for more detailed information on the JSON files holding most of the data. + +## Warps + +Quick note to start, you should not be defining or modifying encoded warps from this repository. They're encoded in the +source code repository for the mod, and then assigned to regions in `data/regions/`. All warps in the game already exist +within `extracted_data.json`, and all relevant warps are already placed in `data/regions/` (unless they were deleted +accidentally). + +Many warps are actually two or three events acting as one logical warp. Doorways, for example, are often 2 tiles wide +indoors but only 1 tile wide outdoors. Both indoor warps point to the outdoor warp, and the outdoor warp points to only +one of the indoor warps. We want to describe warps logically in a way that retains information about individual warp +events. That way a 2-tile-wide doorway doesnt look like a one-way warp next to an unrelated two-way warp, but if we want +to randomize the destinations of those warps, we can still get back each individual id of the multi-tile warp. + +This is how warps are encoded: + +`{source_map}:{source_warp_ids}/{dest_map}:{dest_warp_ids}[!]` + +- `source_map`: The map the warp events are located in +- `source_warp_ids`: The ids of all adjacent warp events in source_map which lead to the same destination (these must be +in ascending order) +- `dest_map`: The map of the warp event to which this one is connected +- `dest_warp_ids`: The ids of the warp events in dest_map +- `[!]`: If the warp expects to lead to a destination which doesnot lead back to it, add a ! to the end + +Example: `MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4` + +Example 2: `MAP_AQUA_HIDEOUT_B1F:14/MAP_AQUA_HIDEOUT_B1F:12!` + +Note: A warp must have its destination set to another warp event. However, that does not guarantee that the destination +warp event will warp back to the source. + +Note 2: Some warps _only_ act as destinations and cannot actually be interacted with by the player as sources. These are +usually places you fall from a hole above. At the time of writing, these are actually not accounted for, but there are +no instances where it changes logical access. + +Note 3: Some warp destinations go to the map `MAP_DYNAMIC` and have a special warp id. These edge cases are: + +- The Moving Truck +- Terra Cave +- Marine Cave +- The Department Store Elevator +- Secret Bases +- The Trade Center +- The Union Room +- The Record Corner +- 2P/4P Battle Colosseum + +Note 4: The trick house on Route 110 changes the warp destinations of its entrance and ending room as you progress +through the puzzles, but the source code only sets the trick house up for the first puzzle, and I assume the destination +gets overwritten at run time when certain flags are set. diff --git a/worlds/pokemon_emerald/__init__.py b/worlds/pokemon_emerald/__init__.py new file mode 100644 index 000000000000..d3ced5f3ca62 --- /dev/null +++ b/worlds/pokemon_emerald/__init__.py @@ -0,0 +1,882 @@ +""" +Archipelago World definition for Pokemon Emerald Version +""" +from collections import Counter +import copy +import logging +import os +from typing import Any, Set, List, Dict, Optional, Tuple, ClassVar + +from BaseClasses import ItemClassification, MultiWorld, Tutorial +from Fill import FillError, fill_restrictive +from Options import Toggle +import settings +from worlds.AutoWorld import WebWorld, World + +from .client import PokemonEmeraldClient # Unused, but required to register with BizHawkClient +from .data import (SpeciesData, MapData, EncounterTableData, LearnsetMove, TrainerPokemonData, StaticEncounterData, + TrainerData, data as emerald_data) +from .items import (ITEM_GROUPS, PokemonEmeraldItem, create_item_label_to_code_map, get_item_classification, + offset_item_value) +from .locations import (LOCATION_GROUPS, PokemonEmeraldLocation, create_location_label_to_id_map, + create_locations_with_tags) +from .options import (ItemPoolType, RandomizeWildPokemon, RandomizeBadges, RandomizeTrainerParties, RandomizeHms, + RandomizeStarters, LevelUpMoves, RandomizeAbilities, RandomizeTypes, TmCompatibility, + HmCompatibility, RandomizeStaticEncounters, NormanRequirement, PokemonEmeraldOptions) +from .pokemon import get_random_species, get_random_move, get_random_damaging_move, get_random_type +from .regions import create_regions +from .rom import PokemonEmeraldDeltaPatch, generate_output, location_visited_event_to_id_map +from .rules import set_rules +from .sanity_check import validate_regions +from .util import int_to_bool_array, bool_array_to_int + + +class PokemonEmeraldWebWorld(WebWorld): + """ + Webhost info for Pokemon Emerald + """ + theme = "ocean" + setup_en = Tutorial( + "Multiworld Setup Guide", + "A guide to playing Pokémon Emerald with Archipelago.", + "English", + "setup_en.md", + "setup/en", + ["Zunawe"] + ) + + tutorials = [setup_en] + + +class PokemonEmeraldSettings(settings.Group): + class PokemonEmeraldRomFile(settings.UserFilePath): + """File name of your English Pokemon Emerald ROM""" + description = "Pokemon Emerald ROM File" + copy_to = "Pokemon - Emerald Version (USA, Europe).gba" + md5s = [PokemonEmeraldDeltaPatch.hash] + + rom_file: PokemonEmeraldRomFile = PokemonEmeraldRomFile(PokemonEmeraldRomFile.copy_to) + + +class PokemonEmeraldWorld(World): + """ + Pokémon Emerald is the definitive Gen III Pokémon game and one of the most beloved in the franchise. + Catch, train, and battle Pokémon, explore the Hoenn region, thwart the plots + of Team Magma and Team Aqua, challenge gyms, and become the Pokémon champion! + """ + game = "Pokemon Emerald" + web = PokemonEmeraldWebWorld() + topology_present = True + + settings_key = "pokemon_emerald_settings" + settings: ClassVar[PokemonEmeraldSettings] + + options_dataclass = PokemonEmeraldOptions + options: PokemonEmeraldOptions + + item_name_to_id = create_item_label_to_code_map() + location_name_to_id = create_location_label_to_id_map() + item_name_groups = ITEM_GROUPS + location_name_groups = LOCATION_GROUPS + + data_version = 1 + required_client_version = (0, 4, 3) + + badge_shuffle_info: Optional[List[Tuple[PokemonEmeraldLocation, PokemonEmeraldItem]]] = None + hm_shuffle_info: Optional[List[Tuple[PokemonEmeraldLocation, PokemonEmeraldItem]]] = None + free_fly_location_id: int = 0 + + modified_species: List[Optional[SpeciesData]] + modified_maps: List[MapData] + modified_tmhm_moves: List[int] + modified_static_encounters: List[int] + modified_starters: Tuple[int, int, int] + modified_trainers: List[TrainerData] + + @classmethod + def stage_assert_generate(cls, multiworld: MultiWorld) -> None: + if not os.path.exists(cls.settings.rom_file): + raise FileNotFoundError(cls.settings.rom_file) + + assert validate_regions() + + def get_filler_item_name(self) -> str: + return "Great Ball" + + def generate_early(self) -> None: + # If badges or HMs are vanilla, Norman locks you from using Surf, which means you're not guaranteed to be + # able to reach Fortree Gym, Mossdeep Gym, or Sootopolis Gym. So we can't require reaching those gyms to + # challenge Norman or it creates a circular dependency. + # This is never a problem for completely random badges/hms because the algo will not place Surf/Balance Badge + # on Norman on its own. It's never a problem for shuffled badges/hms because there is no scenario where Cut or + # the Stone Badge can be a lynchpin for access to any gyms, so they can always be put on Norman in a worst case + # scenario. + # This will also be a problem in warp rando if direct access to Norman's room requires Surf or if access + # any gym leader in general requires Surf. We will probably have to force this to 0 in that case. + max_norman_count = 7 + + if self.options.badges == RandomizeBadges.option_vanilla: + max_norman_count = 4 + + if self.options.hms == RandomizeHms.option_vanilla: + if self.options.norman_requirement == NormanRequirement.option_badges: + if self.options.badges != RandomizeBadges.option_completely_random: + max_norman_count = 4 + if self.options.norman_requirement == NormanRequirement.option_gyms: + max_norman_count = 4 + + if self.options.norman_count.value > max_norman_count: + logging.warning("Pokemon Emerald: Norman requirements for Player %s (%s) are unsafe in combination with " + "other settings. Reducing to 4.", self.player, self.multiworld.get_player_name(self.player)) + self.options.norman_count.value = max_norman_count + + def create_regions(self) -> None: + regions = create_regions(self) + + tags = {"Badge", "HM", "KeyItem", "Rod", "Bike"} + if self.options.overworld_items: + tags.add("OverworldItem") + if self.options.hidden_items: + tags.add("HiddenItem") + if self.options.npc_gifts: + tags.add("NpcGift") + if self.options.enable_ferry: + tags.add("Ferry") + create_locations_with_tags(self, regions, tags) + + self.multiworld.regions.extend(regions.values()) + + def create_items(self) -> None: + item_locations: List[PokemonEmeraldLocation] = [ + location + for location in self.multiworld.get_locations(self.player) + if location.address is not None + ] + + # Filter progression items which shouldn't be shuffled into the itempool. Their locations + # still exist, but event items will be placed and locked at their vanilla locations instead. + filter_tags = set() + + if not self.options.key_items: + filter_tags.add("KeyItem") + if not self.options.rods: + filter_tags.add("Rod") + if not self.options.bikes: + filter_tags.add("Bike") + + if self.options.badges in {RandomizeBadges.option_vanilla, RandomizeBadges.option_shuffle}: + filter_tags.add("Badge") + if self.options.hms in {RandomizeHms.option_vanilla, RandomizeHms.option_shuffle}: + filter_tags.add("HM") + + if self.options.badges == RandomizeBadges.option_shuffle: + self.badge_shuffle_info = [ + (location, self.create_item_by_code(location.default_item_code)) + for location in [l for l in item_locations if "Badge" in l.tags] + ] + if self.options.hms == RandomizeHms.option_shuffle: + self.hm_shuffle_info = [ + (location, self.create_item_by_code(location.default_item_code)) + for location in [l for l in item_locations if "HM" in l.tags] + ] + + item_locations = [location for location in item_locations if len(filter_tags & location.tags) == 0] + default_itempool = [self.create_item_by_code(location.default_item_code) for location in item_locations] + + if self.options.item_pool_type == ItemPoolType.option_shuffled: + self.multiworld.itempool += default_itempool + + elif self.options.item_pool_type in {ItemPoolType.option_diverse, ItemPoolType.option_diverse_balanced}: + item_categories = ["Ball", "Heal", "Vitamin", "EvoStone", "Money", "TM", "Held", "Misc"] + + # Count occurrences of types of vanilla items in pool + item_category_counter = Counter() + for item in default_itempool: + if not item.advancement: + item_category_counter.update([tag for tag in item.tags if tag in item_categories]) + + item_category_weights = [item_category_counter.get(category) for category in item_categories] + item_category_weights = [weight if weight is not None else 0 for weight in item_category_weights] + + # Create lists of item codes that can be used to fill + fill_item_candidates = emerald_data.items.values() + + fill_item_candidates = [item for item in fill_item_candidates if "Unique" not in item.tags] + + fill_item_candidates_by_category = {category: [] for category in item_categories} + for item_data in fill_item_candidates: + for category in item_categories: + if category in item_data.tags: + fill_item_candidates_by_category[category].append(offset_item_value(item_data.item_id)) + + for category in fill_item_candidates_by_category: + fill_item_candidates_by_category[category].sort() + + # Ignore vanilla occurrences and pick completely randomly + if self.options.item_pool_type == ItemPoolType.option_diverse: + item_category_weights = [ + len(category_list) + for category_list in fill_item_candidates_by_category.values() + ] + + # TMs should not have duplicates until every TM has been used already + all_tm_choices = fill_item_candidates_by_category["TM"].copy() + + def refresh_tm_choices() -> None: + fill_item_candidates_by_category["TM"] = all_tm_choices.copy() + self.random.shuffle(fill_item_candidates_by_category["TM"]) + + # Create items + for item in default_itempool: + if not item.advancement and "Unique" not in item.tags: + category = self.random.choices(item_categories, item_category_weights)[0] + if category == "TM": + if len(fill_item_candidates_by_category["TM"]) == 0: + refresh_tm_choices() + item_code = fill_item_candidates_by_category["TM"].pop() + else: + item_code = self.random.choice(fill_item_candidates_by_category[category]) + item = self.create_item_by_code(item_code) + + self.multiworld.itempool.append(item) + + def set_rules(self) -> None: + set_rules(self) + + def generate_basic(self) -> None: + locations: List[PokemonEmeraldLocation] = self.multiworld.get_locations(self.player) + + # Set our free fly location + # If not enabled, set it to Littleroot Town by default + fly_location_name = "EVENT_VISITED_LITTLEROOT_TOWN" + if self.options.free_fly_location: + fly_location_name = self.random.choice([ + "EVENT_VISITED_SLATEPORT_CITY", + "EVENT_VISITED_MAUVILLE_CITY", + "EVENT_VISITED_VERDANTURF_TOWN", + "EVENT_VISITED_FALLARBOR_TOWN", + "EVENT_VISITED_LAVARIDGE_TOWN", + "EVENT_VISITED_FORTREE_CITY", + "EVENT_VISITED_LILYCOVE_CITY", + "EVENT_VISITED_MOSSDEEP_CITY", + "EVENT_VISITED_SOOTOPOLIS_CITY", + "EVENT_VISITED_EVER_GRANDE_CITY" + ]) + + self.free_fly_location_id = location_visited_event_to_id_map[fly_location_name] + + free_fly_location_location = self.multiworld.get_location("FREE_FLY_LOCATION", self.player) + free_fly_location_location.item = None + free_fly_location_location.place_locked_item(self.create_event(fly_location_name)) + + # Key items which are considered in access rules but not randomized are converted to events and placed + # in their vanilla locations so that the player can have them in their inventory for logic. + def convert_unrandomized_items_to_events(tag: str) -> None: + for location in locations: + if location.tags is not None and tag in location.tags: + location.place_locked_item(self.create_event(self.item_id_to_name[location.default_item_code])) + location.address = None + + if self.options.badges == RandomizeBadges.option_vanilla: + convert_unrandomized_items_to_events("Badge") + if self.options.hms == RandomizeHms.option_vanilla: + convert_unrandomized_items_to_events("HM") + if not self.options.rods: + convert_unrandomized_items_to_events("Rod") + if not self.options.bikes: + convert_unrandomized_items_to_events("Bike") + if not self.options.key_items: + convert_unrandomized_items_to_events("KeyItem") + + def pre_fill(self) -> None: + # Items which are shuffled between their own locations + if self.options.badges == RandomizeBadges.option_shuffle: + badge_locations: List[PokemonEmeraldLocation] + badge_items: List[PokemonEmeraldItem] + + # Sort order makes `fill_restrictive` try to place important badges later, which + # makes it less likely to have to swap at all, and more likely for swaps to work. + # In the case of vanilla HMs, navigating Granite Cave is required to access more than 2 gyms, + # so Knuckle Badge deserves highest priority if Flash is logically required. + badge_locations, badge_items = [list(l) for l in zip(*self.badge_shuffle_info)] + badge_priority = { + "Knuckle Badge": 0 if (self.options.hms == RandomizeHms.option_vanilla and self.options.require_flash) else 3, + "Balance Badge": 1, + "Dynamo Badge": 1, + "Mind Badge": 2, + "Heat Badge": 2, + "Rain Badge": 3, + "Stone Badge": 4, + "Feather Badge": 5 + } + badge_items.sort(key=lambda item: badge_priority.get(item.name, 0)) + + collection_state = self.multiworld.get_all_state(False) + if self.hm_shuffle_info is not None: + for _, item in self.hm_shuffle_info: + collection_state.collect(item) + + # In specific very constrained conditions, fill_restrictive may run + # out of swaps before it finds a valid solution if it gets unlucky. + # This is a band-aid until fill/swap can reliably find those solutions. + attempts_remaining = 2 + while attempts_remaining > 0: + attempts_remaining -= 1 + self.random.shuffle(badge_locations) + try: + fill_restrictive(self.multiworld, collection_state, badge_locations, badge_items, + single_player_placement=True, lock=True, allow_excluded=True) + break + except FillError as exc: + if attempts_remaining == 0: + raise exc + + logging.debug(f"Failed to shuffle badges for player {self.player}. Retrying.") + continue + + if self.options.hms == RandomizeHms.option_shuffle: + hm_locations: List[PokemonEmeraldLocation] + hm_items: List[PokemonEmeraldItem] + + # Sort order makes `fill_restrictive` try to place important HMs later, which + # makes it less likely to have to swap at all, and more likely for swaps to work. + # In the case of vanilla badges, navigating Granite Cave is required to access more than 2 gyms, + # so Flash deserves highest priority if it's logically required. + hm_locations, hm_items = [list(l) for l in zip(*self.hm_shuffle_info)] + hm_priority = { + "HM05 Flash": 0 if (self.options.badges == RandomizeBadges.option_vanilla and self.options.require_flash) else 3, + "HM03 Surf": 1, + "HM06 Rock Smash": 1, + "HM08 Dive": 2, + "HM04 Strength": 2, + "HM07 Waterfall": 3, + "HM01 Cut": 4, + "HM02 Fly": 5 + } + hm_items.sort(key=lambda item: hm_priority.get(item.name, 0)) + + collection_state = self.multiworld.get_all_state(False) + + # In specific very constrained conditions, fill_restrictive may run + # out of swaps before it finds a valid solution if it gets unlucky. + # This is a band-aid until fill/swap can reliably find those solutions. + attempts_remaining = 2 + while attempts_remaining > 0: + attempts_remaining -= 1 + self.random.shuffle(hm_locations) + try: + fill_restrictive(self.multiworld, collection_state, hm_locations, hm_items, + single_player_placement=True, lock=True, allow_excluded=True) + break + except FillError as exc: + if attempts_remaining == 0: + raise exc + + logging.debug(f"Failed to shuffle HMs for player {self.player}. Retrying.") + continue + + def generate_output(self, output_directory: str) -> None: + def randomize_abilities() -> None: + # Creating list of potential abilities + ability_label_to_value = {ability.label.lower(): ability.ability_id for ability in emerald_data.abilities} + + ability_blacklist_labels = {"cacophony"} + option_ability_blacklist = self.options.ability_blacklist.value + if option_ability_blacklist is not None: + ability_blacklist_labels |= {ability_label.lower() for ability_label in option_ability_blacklist} + + ability_blacklist = {ability_label_to_value[label] for label in ability_blacklist_labels} + ability_whitelist = [a.ability_id for a in emerald_data.abilities if a.ability_id not in ability_blacklist] + + if self.options.abilities == RandomizeAbilities.option_follow_evolutions: + already_modified: Set[int] = set() + + # Loops through species and only tries to modify abilities if the pokemon has no pre-evolution + # or if the pre-evolution has already been modified. Then tries to modify all species that evolve + # from this one which have the same abilities. + # The outer while loop only runs three times for vanilla ordering: Once for a first pass, once for + # Hitmonlee/Hitmonchan, and once to verify that there's nothing left to do. + while True: + had_clean_pass = True + for species in self.modified_species: + if species is None: + continue + if species.species_id in already_modified: + continue + if species.pre_evolution is not None and species.pre_evolution not in already_modified: + continue + + had_clean_pass = False + + old_abilities = species.abilities + new_abilities = ( + 0 if old_abilities[0] == 0 else self.random.choice(ability_whitelist), + 0 if old_abilities[1] == 0 else self.random.choice(ability_whitelist) + ) + + evolutions = [species] + while len(evolutions) > 0: + evolution = evolutions.pop() + if evolution.abilities == old_abilities: + evolution.abilities = new_abilities + already_modified.add(evolution.species_id) + evolutions += [ + self.modified_species[evolution.species_id] + for evolution in evolution.evolutions + if evolution.species_id not in already_modified + ] + + if had_clean_pass: + break + else: # Not following evolutions + for species in self.modified_species: + if species is None: + continue + + old_abilities = species.abilities + new_abilities = ( + 0 if old_abilities[0] == 0 else self.random.choice(ability_whitelist), + 0 if old_abilities[1] == 0 else self.random.choice(ability_whitelist) + ) + + species.abilities = new_abilities + + def randomize_types() -> None: + if self.options.types == RandomizeTypes.option_shuffle: + type_map = list(range(18)) + self.random.shuffle(type_map) + + # We never want to map to the ??? type, so swap whatever index maps to ??? with ??? + # So ??? will always map to itself, and there are no pokemon which have the ??? type + mystery_type_index = type_map.index(9) + type_map[mystery_type_index], type_map[9] = type_map[9], type_map[mystery_type_index] + + for species in self.modified_species: + if species is not None: + species.types = (type_map[species.types[0]], type_map[species.types[1]]) + elif self.options.types == RandomizeTypes.option_completely_random: + for species in self.modified_species: + if species is not None: + new_type_1 = get_random_type(self.random) + new_type_2 = new_type_1 + if species.types[0] != species.types[1]: + while new_type_1 == new_type_2: + new_type_2 = get_random_type(self.random) + + species.types = (new_type_1, new_type_2) + elif self.options.types == RandomizeTypes.option_follow_evolutions: + already_modified: Set[int] = set() + + # Similar to follow evolutions for abilities, but only needs to loop through once. + # For every pokemon without a pre-evolution, generates a random mapping from old types to new types + # and then walks through the evolution tree applying that map. This means that evolutions that share + # types will have those types mapped to the same new types, and evolutions with new or diverging types + # will still have new or diverging types. + # Consider: + # - Charmeleon (Fire/Fire) -> Charizard (Fire/Flying) + # - Onyx (Rock/Ground) -> Steelix (Steel/Ground) + # - Nincada (Bug/Ground) -> Ninjask (Bug/Flying) && Shedinja (Bug/Ghost) + # - Azurill (Normal/Normal) -> Marill (Water/Water) + for species in self.modified_species: + if species is None: + continue + if species.species_id in already_modified: + continue + if species.pre_evolution is not None and species.pre_evolution not in already_modified: + continue + + type_map = list(range(18)) + self.random.shuffle(type_map) + + # We never want to map to the ??? type, so swap whatever index maps to ??? with ??? + # So ??? will always map to itself, and there are no pokemon which have the ??? type + mystery_type_index = type_map.index(9) + type_map[mystery_type_index], type_map[9] = type_map[9], type_map[mystery_type_index] + + evolutions = [species] + while len(evolutions) > 0: + evolution = evolutions.pop() + evolution.types = (type_map[evolution.types[0]], type_map[evolution.types[1]]) + already_modified.add(evolution.species_id) + evolutions += [self.modified_species[evo.species_id] for evo in evolution.evolutions] + + def randomize_learnsets() -> None: + type_bias = self.options.move_match_type_bias.value + normal_bias = self.options.move_normal_type_bias.value + + for species in self.modified_species: + if species is None: + continue + + old_learnset = species.learnset + new_learnset: List[LearnsetMove] = [] + + i = 0 + # Replace filler MOVE_NONEs at start of list + while old_learnset[i].move_id == 0: + if self.options.level_up_moves == LevelUpMoves.option_start_with_four_moves: + new_move = get_random_move(self.random, {move.move_id for move in new_learnset}, type_bias, + normal_bias, species.types) + else: + new_move = 0 + new_learnset.append(LearnsetMove(old_learnset[i].level, new_move)) + i += 1 + + while i < len(old_learnset): + # Guarantees the starter has a good damaging move + if i == 3: + new_move = get_random_damaging_move(self.random, {move.move_id for move in new_learnset}) + else: + new_move = get_random_move(self.random, {move.move_id for move in new_learnset}, type_bias, + normal_bias, species.types) + new_learnset.append(LearnsetMove(old_learnset[i].level, new_move)) + i += 1 + + species.learnset = new_learnset + + def randomize_tm_hm_compatibility() -> None: + for species in self.modified_species: + if species is None: + continue + + combatibility_array = int_to_bool_array(species.tm_hm_compatibility) + + # TMs + for i in range(0, 50): + if self.options.tm_compatibility == TmCompatibility.option_fully_compatible: + combatibility_array[i] = True + elif self.options.tm_compatibility == TmCompatibility.option_completely_random: + combatibility_array[i] = self.random.choice([True, False]) + + # HMs + for i in range(50, 58): + if self.options.hm_compatibility == HmCompatibility.option_fully_compatible: + combatibility_array[i] = True + elif self.options.hm_compatibility == HmCompatibility.option_completely_random: + combatibility_array[i] = self.random.choice([True, False]) + + species.tm_hm_compatibility = bool_array_to_int(combatibility_array) + + def randomize_tm_moves() -> None: + new_moves: Set[int] = set() + + for i in range(50): + new_move = get_random_move(self.random, new_moves) + new_moves.add(new_move) + self.modified_tmhm_moves[i] = new_move + + def randomize_wild_encounters() -> None: + should_match_bst = self.options.wild_pokemon in { + RandomizeWildPokemon.option_match_base_stats, + RandomizeWildPokemon.option_match_base_stats_and_type + } + should_match_type = self.options.wild_pokemon in { + RandomizeWildPokemon.option_match_type, + RandomizeWildPokemon.option_match_base_stats_and_type + } + should_allow_legendaries = self.options.allow_wild_legendaries == Toggle.option_true + + for map_data in self.modified_maps: + new_encounters: List[Optional[EncounterTableData]] = [None, None, None] + old_encounters = [map_data.land_encounters, map_data.water_encounters, map_data.fishing_encounters] + + for i, table in enumerate(old_encounters): + if table is not None: + species_old_to_new_map: Dict[int, int] = {} + for species_id in table.slots: + if species_id not in species_old_to_new_map: + original_species = emerald_data.species[species_id] + target_bst = sum(original_species.base_stats) if should_match_bst else None + target_type = self.random.choice(original_species.types) if should_match_type else None + + species_old_to_new_map[species_id] = get_random_species( + self.random, + self.modified_species, + target_bst, + target_type, + should_allow_legendaries + ).species_id + + new_slots: List[int] = [] + for species_id in table.slots: + new_slots.append(species_old_to_new_map[species_id]) + + new_encounters[i] = EncounterTableData(new_slots, table.rom_address) + + map_data.land_encounters = new_encounters[0] + map_data.water_encounters = new_encounters[1] + map_data.fishing_encounters = new_encounters[2] + + def randomize_static_encounters() -> None: + if self.options.static_encounters == RandomizeStaticEncounters.option_shuffle: + shuffled_species = [encounter.species_id for encounter in emerald_data.static_encounters] + self.random.shuffle(shuffled_species) + + self.modified_static_encounters = [] + for i, encounter in enumerate(emerald_data.static_encounters): + self.modified_static_encounters.append(StaticEncounterData( + shuffled_species[i], + encounter.rom_address + )) + else: + should_match_bst = self.options.static_encounters in { + RandomizeStaticEncounters.option_match_base_stats, + RandomizeStaticEncounters.option_match_base_stats_and_type + } + should_match_type = self.options.static_encounters in { + RandomizeStaticEncounters.option_match_type, + RandomizeStaticEncounters.option_match_base_stats_and_type + } + + for encounter in emerald_data.static_encounters: + original_species = self.modified_species[encounter.species_id] + target_bst = sum(original_species.base_stats) if should_match_bst else None + target_type = self.random.choice(original_species.types) if should_match_type else None + + self.modified_static_encounters.append(StaticEncounterData( + get_random_species(self.random, self.modified_species, target_bst, target_type).species_id, + encounter.rom_address + )) + + def randomize_opponent_parties() -> None: + should_match_bst = self.options.trainer_parties in { + RandomizeTrainerParties.option_match_base_stats, + RandomizeTrainerParties.option_match_base_stats_and_type + } + should_match_type = self.options.trainer_parties in { + RandomizeTrainerParties.option_match_type, + RandomizeTrainerParties.option_match_base_stats_and_type + } + allow_legendaries = self.options.allow_trainer_legendaries == Toggle.option_true + + per_species_tmhm_moves: Dict[int, List[int]] = {} + + for trainer in self.modified_trainers: + new_party = [] + for pokemon in trainer.party.pokemon: + original_species = emerald_data.species[pokemon.species_id] + target_bst = sum(original_species.base_stats) if should_match_bst else None + target_type = self.random.choice(original_species.types) if should_match_type else None + + new_species = get_random_species( + self.random, + self.modified_species, + target_bst, + target_type, + allow_legendaries + ) + + if new_species.species_id not in per_species_tmhm_moves: + per_species_tmhm_moves[new_species.species_id] = list({ + self.modified_tmhm_moves[i] + for i, is_compatible in enumerate(int_to_bool_array(new_species.tm_hm_compatibility)) + if is_compatible + }) + + tm_hm_movepool = per_species_tmhm_moves[new_species.species_id] + level_up_movepool = list({ + move.move_id + for move in new_species.learnset + if move.level <= pokemon.level + }) + + new_moves = ( + self.random.choice(tm_hm_movepool if self.random.random() < 0.25 and len(tm_hm_movepool) > 0 else level_up_movepool), + self.random.choice(tm_hm_movepool if self.random.random() < 0.25 and len(tm_hm_movepool) > 0 else level_up_movepool), + self.random.choice(tm_hm_movepool if self.random.random() < 0.25 and len(tm_hm_movepool) > 0 else level_up_movepool), + self.random.choice(tm_hm_movepool if self.random.random() < 0.25 and len(tm_hm_movepool) > 0 else level_up_movepool) + ) + + new_party.append(TrainerPokemonData(new_species.species_id, pokemon.level, new_moves)) + + trainer.party.pokemon = new_party + + def randomize_starters() -> None: + match_bst = self.options.starters in { + RandomizeStarters.option_match_base_stats, + RandomizeStarters.option_match_base_stats_and_type + } + match_type = self.options.starters in { + RandomizeStarters.option_match_type, + RandomizeStarters.option_match_base_stats_and_type + } + allow_legendaries = self.options.allow_starter_legendaries == Toggle.option_true + + starter_bsts = ( + sum(emerald_data.species[emerald_data.starters[0]].base_stats) if match_bst else None, + sum(emerald_data.species[emerald_data.starters[1]].base_stats) if match_bst else None, + sum(emerald_data.species[emerald_data.starters[2]].base_stats) if match_bst else None + ) + + starter_types = ( + self.random.choice(emerald_data.species[emerald_data.starters[0]].types) if match_type else None, + self.random.choice(emerald_data.species[emerald_data.starters[1]].types) if match_type else None, + self.random.choice(emerald_data.species[emerald_data.starters[2]].types) if match_type else None + ) + + new_starters = ( + get_random_species(self.random, self.modified_species, + starter_bsts[0], starter_types[0], allow_legendaries), + get_random_species(self.random, self.modified_species, + starter_bsts[1], starter_types[1], allow_legendaries), + get_random_species(self.random, self.modified_species, + starter_bsts[2], starter_types[2], allow_legendaries) + ) + + egg_code = self.options.easter_egg.value + egg_check_1 = 0 + egg_check_2 = 0 + + for i in egg_code: + egg_check_1 += ord(i) + egg_check_2 += egg_check_1 * egg_check_1 + + egg = 96 + egg_check_2 - (egg_check_1 * 0x077C) + if egg_check_2 == 0x14E03A and egg < 411 and egg > 0 and egg not in range(252, 277): + self.modified_starters = (egg, egg, egg) + else: + self.modified_starters = ( + new_starters[0].species_id, + new_starters[1].species_id, + new_starters[2].species_id + ) + + # Putting the unchosen starter onto the rival's team + rival_teams: List[List[Tuple[str, int, bool]]] = [ + [ + ("TRAINER_BRENDAN_ROUTE_103_TREECKO", 0, False), + ("TRAINER_BRENDAN_RUSTBORO_TREECKO", 1, False), + ("TRAINER_BRENDAN_ROUTE_110_TREECKO", 2, True ), + ("TRAINER_BRENDAN_ROUTE_119_TREECKO", 2, True ), + ("TRAINER_BRENDAN_LILYCOVE_TREECKO", 3, True ), + ("TRAINER_MAY_ROUTE_103_TREECKO", 0, False), + ("TRAINER_MAY_RUSTBORO_TREECKO", 1, False), + ("TRAINER_MAY_ROUTE_110_TREECKO", 2, True ), + ("TRAINER_MAY_ROUTE_119_TREECKO", 2, True ), + ("TRAINER_MAY_LILYCOVE_TREECKO", 3, True ) + ], + [ + ("TRAINER_BRENDAN_ROUTE_103_TORCHIC", 0, False), + ("TRAINER_BRENDAN_RUSTBORO_TORCHIC", 1, False), + ("TRAINER_BRENDAN_ROUTE_110_TORCHIC", 2, True ), + ("TRAINER_BRENDAN_ROUTE_119_TORCHIC", 2, True ), + ("TRAINER_BRENDAN_LILYCOVE_TORCHIC", 3, True ), + ("TRAINER_MAY_ROUTE_103_TORCHIC", 0, False), + ("TRAINER_MAY_RUSTBORO_TORCHIC", 1, False), + ("TRAINER_MAY_ROUTE_110_TORCHIC", 2, True ), + ("TRAINER_MAY_ROUTE_119_TORCHIC", 2, True ), + ("TRAINER_MAY_LILYCOVE_TORCHIC", 3, True ) + ], + [ + ("TRAINER_BRENDAN_ROUTE_103_MUDKIP", 0, False), + ("TRAINER_BRENDAN_RUSTBORO_MUDKIP", 1, False), + ("TRAINER_BRENDAN_ROUTE_110_MUDKIP", 2, True ), + ("TRAINER_BRENDAN_ROUTE_119_MUDKIP", 2, True ), + ("TRAINER_BRENDAN_LILYCOVE_MUDKIP", 3, True ), + ("TRAINER_MAY_ROUTE_103_MUDKIP", 0, False), + ("TRAINER_MAY_RUSTBORO_MUDKIP", 1, False), + ("TRAINER_MAY_ROUTE_110_MUDKIP", 2, True ), + ("TRAINER_MAY_ROUTE_119_MUDKIP", 2, True ), + ("TRAINER_MAY_LILYCOVE_MUDKIP", 3, True ) + ] + ] + + for i, starter in enumerate([new_starters[1], new_starters[2], new_starters[0]]): + potential_evolutions = [evolution.species_id for evolution in starter.evolutions] + picked_evolution = starter.species_id + if len(potential_evolutions) > 0: + picked_evolution = self.random.choice(potential_evolutions) + + for trainer_name, starter_position, is_evolved in rival_teams[i]: + trainer_data = self.modified_trainers[emerald_data.constants[trainer_name]] + trainer_data.party.pokemon[starter_position].species_id = picked_evolution if is_evolved else starter.species_id + + self.modified_species = copy.deepcopy(emerald_data.species) + self.modified_trainers = copy.deepcopy(emerald_data.trainers) + self.modified_maps = copy.deepcopy(emerald_data.maps) + self.modified_tmhm_moves = copy.deepcopy(emerald_data.tmhm_moves) + self.modified_static_encounters = copy.deepcopy(emerald_data.static_encounters) + self.modified_starters = copy.deepcopy(emerald_data.starters) + + # Randomize species data + if self.options.abilities != RandomizeAbilities.option_vanilla: + randomize_abilities() + + if self.options.types != RandomizeTypes.option_vanilla: + randomize_types() + + if self.options.level_up_moves != LevelUpMoves.option_vanilla: + randomize_learnsets() + + randomize_tm_hm_compatibility() # Options are checked within this function + + min_catch_rate = min(self.options.min_catch_rate.value, 255) + for species in self.modified_species: + if species is not None: + species.catch_rate = max(species.catch_rate, min_catch_rate) + + if self.options.tm_moves: + randomize_tm_moves() + + # Randomize wild encounters + if self.options.wild_pokemon != RandomizeWildPokemon.option_vanilla: + randomize_wild_encounters() + + # Randomize static encounters + if self.options.static_encounters != RandomizeStaticEncounters.option_vanilla: + randomize_static_encounters() + + # Randomize opponents + if self.options.trainer_parties != RandomizeTrainerParties.option_vanilla: + randomize_opponent_parties() + + # Randomize starters + if self.options.starters != RandomizeStarters.option_vanilla: + randomize_starters() + + generate_output(self, output_directory) + + def fill_slot_data(self) -> Dict[str, Any]: + slot_data = self.options.as_dict( + "goal", + "badges", + "hms", + "key_items", + "bikes", + "rods", + "overworld_items", + "hidden_items", + "npc_gifts", + "require_itemfinder", + "require_flash", + "enable_ferry", + "elite_four_requirement", + "elite_four_count", + "norman_requirement", + "norman_count", + "extra_boulders", + "remove_roadblocks", + "free_fly_location", + "fly_without_badge", + ) + slot_data["free_fly_location_id"] = self.free_fly_location_id + return slot_data + + def create_item(self, name: str) -> PokemonEmeraldItem: + return self.create_item_by_code(self.item_name_to_id[name]) + + def create_item_by_code(self, item_code: int) -> PokemonEmeraldItem: + return PokemonEmeraldItem( + self.item_id_to_name[item_code], + get_item_classification(item_code), + item_code, + self.player + ) + + def create_event(self, name: str) -> PokemonEmeraldItem: + return PokemonEmeraldItem( + name, + ItemClassification.progression, + None, + self.player + ) diff --git a/worlds/pokemon_emerald/client.py b/worlds/pokemon_emerald/client.py new file mode 100644 index 000000000000..5420b15fbe95 --- /dev/null +++ b/worlds/pokemon_emerald/client.py @@ -0,0 +1,277 @@ +from typing import TYPE_CHECKING, Dict, Set + +from NetUtils import ClientStatus +import worlds._bizhawk as bizhawk +from worlds._bizhawk.client import BizHawkClient + +from .data import BASE_OFFSET, data +from .options import Goal + +if TYPE_CHECKING: + from worlds._bizhawk.context import BizHawkClientContext + + +EXPECTED_ROM_NAME = "pokemon emerald version / AP 2" + +IS_CHAMPION_FLAG = data.constants["FLAG_IS_CHAMPION"] +DEFEATED_STEVEN_FLAG = data.constants["TRAINER_FLAGS_START"] + data.constants["TRAINER_STEVEN"] +DEFEATED_NORMAN_FLAG = data.constants["TRAINER_FLAGS_START"] + data.constants["TRAINER_NORMAN_1"] + +# These flags are communicated to the tracker as a bitfield using this order. +# Modifying the order will cause undetectable autotracking issues. +TRACKER_EVENT_FLAGS = [ + "FLAG_DEFEATED_RUSTBORO_GYM", + "FLAG_DEFEATED_DEWFORD_GYM", + "FLAG_DEFEATED_MAUVILLE_GYM", + "FLAG_DEFEATED_LAVARIDGE_GYM", + "FLAG_DEFEATED_PETALBURG_GYM", + "FLAG_DEFEATED_FORTREE_GYM", + "FLAG_DEFEATED_MOSSDEEP_GYM", + "FLAG_DEFEATED_SOOTOPOLIS_GYM", + "FLAG_RECEIVED_POKENAV", # Talk to Mr. Stone + "FLAG_DELIVERED_STEVEN_LETTER", + "FLAG_DELIVERED_DEVON_GOODS", + "FLAG_HIDE_ROUTE_119_TEAM_AQUA", # Clear Weather Institute + "FLAG_MET_ARCHIE_METEOR_FALLS", # Magma steals meteorite + "FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT", # Clear Magma Hideout + "FLAG_MET_TEAM_AQUA_HARBOR", # Aqua steals submarine + "FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE", # Clear Aqua Hideout + "FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_MAGMA_NOTE", # Clear Space Center + "FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN", + "FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA", # Rayquaza departs for Sootopolis + "FLAG_OMIT_DIVE_FROM_STEVEN_LETTER", # Steven gives Dive HM (clears seafloor cavern grunt) + "FLAG_IS_CHAMPION", + "FLAG_PURCHASED_HARBOR_MAIL" +] +EVENT_FLAG_MAP = {data.constants[flag_name]: flag_name for flag_name in TRACKER_EVENT_FLAGS} + +KEY_LOCATION_FLAGS = [ + "NPC_GIFT_RECEIVED_HM01", + "NPC_GIFT_RECEIVED_HM02", + "NPC_GIFT_RECEIVED_HM03", + "NPC_GIFT_RECEIVED_HM04", + "NPC_GIFT_RECEIVED_HM05", + "NPC_GIFT_RECEIVED_HM06", + "NPC_GIFT_RECEIVED_HM07", + "NPC_GIFT_RECEIVED_HM08", + "NPC_GIFT_RECEIVED_ACRO_BIKE", + "NPC_GIFT_RECEIVED_WAILMER_PAIL", + "NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL", + "NPC_GIFT_RECEIVED_LETTER", + "NPC_GIFT_RECEIVED_METEORITE", + "NPC_GIFT_RECEIVED_GO_GOGGLES", + "NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON", + "NPC_GIFT_RECEIVED_ITEMFINDER", + "NPC_GIFT_RECEIVED_DEVON_SCOPE", + "NPC_GIFT_RECEIVED_MAGMA_EMBLEM", + "NPC_GIFT_RECEIVED_POKEBLOCK_CASE", + "NPC_GIFT_RECEIVED_SS_TICKET", + "HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY", + "HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY", + "HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY", + "HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY", + "ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_4_SCANNER", + "ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY", + "NPC_GIFT_RECEIVED_OLD_ROD", + "NPC_GIFT_RECEIVED_GOOD_ROD", + "NPC_GIFT_RECEIVED_SUPER_ROD", +] +KEY_LOCATION_FLAG_MAP = {data.locations[location_name].flag: location_name for location_name in KEY_LOCATION_FLAGS} + + +class PokemonEmeraldClient(BizHawkClient): + game = "Pokemon Emerald" + system = "GBA" + patch_suffix = ".apemerald" + local_checked_locations: Set[int] + local_set_events: Dict[str, bool] + local_found_key_items: Dict[str, bool] + goal_flag: int + + def __init__(self) -> None: + super().__init__() + self.local_checked_locations = set() + self.local_set_events = {} + self.local_found_key_items = {} + self.goal_flag = IS_CHAMPION_FLAG + + async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: + from CommonClient import logger + + try: + # Check ROM name/patch version + rom_name_bytes = ((await bizhawk.read(ctx.bizhawk_ctx, [(0x108, 32, "ROM")]))[0]) + rom_name = bytes([byte for byte in rom_name_bytes if byte != 0]).decode("ascii") + if not rom_name.startswith("pokemon emerald version"): + return False + if rom_name == "pokemon emerald version": + logger.info("ERROR: You appear to be running an unpatched version of Pokemon Emerald. " + "You need to generate a patch file and use it to create a patched ROM.") + return False + if rom_name != EXPECTED_ROM_NAME: + logger.info("ERROR: The patch file used to create this ROM is not compatible with " + "this client. Double check your client version against the version being " + "used by the generator.") + return False + except UnicodeDecodeError: + return False + except bizhawk.RequestFailedError: + return False # Should verify on the next pass + + ctx.game = self.game + ctx.items_handling = 0b001 + ctx.want_slot_data = True + ctx.watcher_timeout = 0.125 + + return True + + async def set_auth(self, ctx: "BizHawkClientContext") -> None: + slot_name_bytes = (await bizhawk.read(ctx.bizhawk_ctx, [(data.rom_addresses["gArchipelagoInfo"], 64, "ROM")]))[0] + ctx.auth = bytes([byte for byte in slot_name_bytes if byte != 0]).decode("utf-8") + + async def game_watcher(self, ctx: "BizHawkClientContext") -> None: + if ctx.slot_data is not None: + if ctx.slot_data["goal"] == Goal.option_champion: + self.goal_flag = IS_CHAMPION_FLAG + elif ctx.slot_data["goal"] == Goal.option_steven: + self.goal_flag = DEFEATED_STEVEN_FLAG + elif ctx.slot_data["goal"] == Goal.option_norman: + self.goal_flag = DEFEATED_NORMAN_FLAG + + try: + # Checks that the player is in the overworld + overworld_guard = (data.ram_addresses["gMain"] + 4, (data.ram_addresses["CB2_Overworld"] + 1).to_bytes(4, "little"), "System Bus") + + # Read save block address + read_result = await bizhawk.guarded_read( + ctx.bizhawk_ctx, + [(data.ram_addresses["gSaveBlock1Ptr"], 4, "System Bus")], + [overworld_guard] + ) + if read_result is None: # Not in overworld + return + + # Checks that the save block hasn't moved + save_block_address_guard = (data.ram_addresses["gSaveBlock1Ptr"], read_result[0], "System Bus") + + save_block_address = int.from_bytes(read_result[0], "little") + + # Handle giving the player items + read_result = await bizhawk.guarded_read( + ctx.bizhawk_ctx, + [ + (save_block_address + 0x3778, 2, "System Bus"), # Number of received items + (data.ram_addresses["gArchipelagoReceivedItem"] + 4, 1, "System Bus") # Received item struct full? + ], + [overworld_guard, save_block_address_guard] + ) + if read_result is None: # Not in overworld, or save block moved + return + + num_received_items = int.from_bytes(read_result[0], "little") + received_item_is_empty = read_result[1][0] == 0 + + # If the game hasn't received all items yet and the received item struct doesn't contain an item, then + # fill it with the next item + if num_received_items < len(ctx.items_received) and received_item_is_empty: + next_item = ctx.items_received[num_received_items] + await bizhawk.write(ctx.bizhawk_ctx, [ + (data.ram_addresses["gArchipelagoReceivedItem"] + 0, (next_item.item - BASE_OFFSET).to_bytes(2, "little"), "System Bus"), + (data.ram_addresses["gArchipelagoReceivedItem"] + 2, (num_received_items + 1).to_bytes(2, "little"), "System Bus"), + (data.ram_addresses["gArchipelagoReceivedItem"] + 4, [1], "System Bus"), # Mark struct full + (data.ram_addresses["gArchipelagoReceivedItem"] + 5, [next_item.flags & 1], "System Bus"), + ]) + + # Read flags in 2 chunks + read_result = await bizhawk.guarded_read( + ctx.bizhawk_ctx, + [(save_block_address + 0x1450, 0x96, "System Bus")], # Flags + [overworld_guard, save_block_address_guard] + ) + if read_result is None: # Not in overworld, or save block moved + return + + flag_bytes = read_result[0] + + read_result = await bizhawk.guarded_read( + ctx.bizhawk_ctx, + [(save_block_address + 0x14E6, 0x96, "System Bus")], # Flags + [overworld_guard, save_block_address_guard] + ) + if read_result is not None: + flag_bytes += read_result[0] + + game_clear = False + local_checked_locations = set() + local_set_events = {flag_name: False for flag_name in TRACKER_EVENT_FLAGS} + local_found_key_items = {location_name: False for location_name in KEY_LOCATION_FLAGS} + + # Check set flags + for byte_i, byte in enumerate(flag_bytes): + for i in range(8): + if byte & (1 << i) != 0: + flag_id = byte_i * 8 + i + + location_id = flag_id + BASE_OFFSET + if location_id in ctx.server_locations: + local_checked_locations.add(location_id) + + if flag_id == self.goal_flag: + game_clear = True + + if flag_id in EVENT_FLAG_MAP: + local_set_events[EVENT_FLAG_MAP[flag_id]] = True + + if flag_id in KEY_LOCATION_FLAG_MAP: + local_found_key_items[KEY_LOCATION_FLAG_MAP[flag_id]] = True + + # Send locations + if local_checked_locations != self.local_checked_locations: + self.local_checked_locations = local_checked_locations + + if local_checked_locations is not None: + await ctx.send_msgs([{ + "cmd": "LocationChecks", + "locations": list(local_checked_locations) + }]) + + # Send game clear + if not ctx.finished_game and game_clear: + await ctx.send_msgs([{ + "cmd": "StatusUpdate", + "status": ClientStatus.CLIENT_GOAL + }]) + + # Send tracker event flags + if local_set_events != self.local_set_events and ctx.slot is not None: + event_bitfield = 0 + for i, flag_name in enumerate(TRACKER_EVENT_FLAGS): + if local_set_events[flag_name]: + event_bitfield |= 1 << i + + await ctx.send_msgs([{ + "cmd": "Set", + "key": f"pokemon_emerald_events_{ctx.team}_{ctx.slot}", + "default": 0, + "want_reply": False, + "operations": [{"operation": "replace", "value": event_bitfield}] + }]) + self.local_set_events = local_set_events + + if local_found_key_items != self.local_found_key_items: + key_bitfield = 0 + for i, location_name in enumerate(KEY_LOCATION_FLAGS): + if local_found_key_items[location_name]: + key_bitfield |= 1 << i + + await ctx.send_msgs([{ + "cmd": "Set", + "key": f"pokemon_emerald_keys_{ctx.team}_{ctx.slot}", + "default": 0, + "want_reply": False, + "operations": [{"operation": "replace", "value": key_bitfield}] + }]) + self.local_found_key_items = local_found_key_items + except bizhawk.RequestFailedError: + # Exit handler and return to main loop to reconnect + pass diff --git a/worlds/pokemon_emerald/data.py b/worlds/pokemon_emerald/data.py new file mode 100644 index 000000000000..bc51d84963c5 --- /dev/null +++ b/worlds/pokemon_emerald/data.py @@ -0,0 +1,995 @@ +""" +Pulls data from JSON files in worlds/pokemon_emerald/data/ into classes. +This also includes marrying automatically extracted data with manually +defined data (like location labels or usable pokemon species), some cleanup +and sorting, and Warp methods. +""" +from dataclasses import dataclass +import copy +from enum import IntEnum +import orjson +from typing import Dict, List, NamedTuple, Optional, Set, FrozenSet, Tuple, Any, Union +import pkgutil +import pkg_resources + +from BaseClasses import ItemClassification + + +BASE_OFFSET = 3860000 + + +class Warp: + """ + Represents warp events in the game like doorways or warp pads + """ + is_one_way: bool + source_map: str + source_ids: List[int] + dest_map: str + dest_ids: List[int] + parent_region: Optional[str] + + def __init__(self, encoded_string: Optional[str] = None, parent_region: Optional[str] = None) -> None: + if encoded_string is not None: + decoded_warp = Warp.decode(encoded_string) + self.is_one_way = decoded_warp.is_one_way + self.source_map = decoded_warp.source_map + self.source_ids = decoded_warp.source_ids + self.dest_map = decoded_warp.dest_map + self.dest_ids = decoded_warp.dest_ids + self.parent_region = parent_region + + def encode(self) -> str: + """ + Returns a string encoding of this warp + """ + source_ids_string = "" + for source_id in self.source_ids: + source_ids_string += str(source_id) + "," + source_ids_string = source_ids_string[:-1] # Remove last "," + + dest_ids_string = "" + for dest_id in self.dest_ids: + dest_ids_string += str(dest_id) + "," + dest_ids_string = dest_ids_string[:-1] # Remove last "," + + return f"{self.source_map}:{source_ids_string}/{self.dest_map}:{dest_ids_string}{'!' if self.is_one_way else ''}" + + def connects_to(self, other: 'Warp') -> bool: + """ + Returns true if this warp sends the player to `other` + """ + return self.dest_map == other.source_map and set(self.dest_ids) <= set(other.source_ids) + + @staticmethod + def decode(encoded_string: str) -> 'Warp': + """ + Create a Warp object from an encoded string + """ + warp = Warp() + warp.is_one_way = encoded_string.endswith("!") + if warp.is_one_way: + encoded_string = encoded_string[:-1] + + warp_source, warp_dest = encoded_string.split("/") + warp_source_map, warp_source_indices = warp_source.split(":") + warp_dest_map, warp_dest_indices = warp_dest.split(":") + + warp.source_map = warp_source_map + warp.dest_map = warp_dest_map + + warp.source_ids = [int(index) for index in warp_source_indices.split(",")] + warp.dest_ids = [int(index) for index in warp_dest_indices.split(",")] + + return warp + + +class ItemData(NamedTuple): + label: str + item_id: int + classification: ItemClassification + tags: FrozenSet[str] + + +class LocationData(NamedTuple): + name: str + label: str + parent_region: str + default_item: int + rom_address: int + flag: int + tags: FrozenSet[str] + + +class EventData(NamedTuple): + name: str + parent_region: str + + +class RegionData: + name: str + exits: List[str] + warps: List[str] + locations: List[str] + events: List[EventData] + + def __init__(self, name: str): + self.name = name + self.exits = [] + self.warps = [] + self.locations = [] + self.events = [] + + +class BaseStats(NamedTuple): + hp: int + attack: int + defense: int + speed: int + special_attack: int + special_defense: int + + +class LearnsetMove(NamedTuple): + level: int + move_id: int + + +class EvolutionMethodEnum(IntEnum): + LEVEL = 0 + LEVEL_ATK_LT_DEF = 1 + LEVEL_ATK_EQ_DEF = 2 + LEVEL_ATK_GT_DEF = 3 + LEVEL_SILCOON = 4 + LEVEL_CASCOON = 5 + LEVEL_NINJASK = 6 + LEVEL_SHEDINJA = 7 + ITEM = 8 + FRIENDSHIP = 9 + FRIENDSHIP_DAY = 10 + 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 + species_id: int + + +class StaticEncounterData(NamedTuple): + species_id: int + rom_address: int + + +@dataclass +class SpeciesData: + name: str + label: str + species_id: int + base_stats: BaseStats + types: Tuple[int, int] + abilities: Tuple[int, int] + evolutions: List[EvolutionData] + pre_evolution: Optional[int] + catch_rate: int + learnset: List[LearnsetMove] + tm_hm_compatibility: int + learnset_rom_address: int + rom_address: int + + +class AbilityData(NamedTuple): + ability_id: int + label: str + + +class EncounterTableData(NamedTuple): + slots: List[int] + rom_address: int + + +@dataclass +class MapData: + name: str + land_encounters: Optional[EncounterTableData] + water_encounters: Optional[EncounterTableData] + fishing_encounters: Optional[EncounterTableData] + + +class TrainerPokemonDataTypeEnum(IntEnum): + NO_ITEM_DEFAULT_MOVES = 0 + ITEM_DEFAULT_MOVES = 1 + NO_ITEM_CUSTOM_MOVES = 2 + ITEM_CUSTOM_MOVES = 3 + + +def _str_to_pokemon_data_type(string: str) -> TrainerPokemonDataTypeEnum: + if string == "NO_ITEM_DEFAULT_MOVES": + return TrainerPokemonDataTypeEnum.NO_ITEM_DEFAULT_MOVES + if string == "ITEM_DEFAULT_MOVES": + return TrainerPokemonDataTypeEnum.ITEM_DEFAULT_MOVES + if string == "NO_ITEM_CUSTOM_MOVES": + return TrainerPokemonDataTypeEnum.NO_ITEM_CUSTOM_MOVES + if string == "ITEM_CUSTOM_MOVES": + return TrainerPokemonDataTypeEnum.ITEM_CUSTOM_MOVES + + +@dataclass +class TrainerPokemonData: + species_id: int + level: int + moves: Optional[Tuple[int, int, int, int]] + + +@dataclass +class TrainerPartyData: + pokemon: List[TrainerPokemonData] + pokemon_data_type: TrainerPokemonDataTypeEnum + rom_address: int + + +@dataclass +class TrainerData: + trainer_id: int + party: TrainerPartyData + rom_address: int + battle_script_rom_address: int + + +class PokemonEmeraldData: + starters: Tuple[int, int, int] + constants: Dict[str, int] + ram_addresses: Dict[str, int] + rom_addresses: Dict[str, int] + regions: Dict[str, RegionData] + locations: Dict[str, LocationData] + items: Dict[int, ItemData] + species: List[Optional[SpeciesData]] + static_encounters: List[StaticEncounterData] + tmhm_moves: List[int] + abilities: List[AbilityData] + maps: List[MapData] + warps: Dict[str, Warp] + warp_map: Dict[str, Optional[str]] + trainers: List[TrainerData] + + def __init__(self) -> None: + self.starters = (277, 280, 283) + self.constants = {} + self.ram_addresses = {} + self.rom_addresses = {} + self.regions = {} + self.locations = {} + self.items = {} + self.species = [] + self.static_encounters = [] + self.tmhm_moves = [] + self.abilities = [] + self.maps = [] + self.warps = {} + self.warp_map = {} + self.trainers = [] + + +def load_json_data(data_name: str) -> Union[List[Any], Dict[str, Any]]: + return orjson.loads(pkgutil.get_data(__name__, "data/" + data_name).decode('utf-8-sig')) + + +data = PokemonEmeraldData() + +def create_data_copy() -> PokemonEmeraldData: + new_copy = PokemonEmeraldData() + new_copy.species = copy.deepcopy(data.species) + new_copy.tmhm_moves = copy.deepcopy(data.tmhm_moves) + new_copy.maps = copy.deepcopy(data.maps) + new_copy.static_encounters = copy.deepcopy(data.static_encounters) + new_copy.trainers = copy.deepcopy(data.trainers) + + +def _init() -> None: + extracted_data: Dict[str, Any] = load_json_data("extracted_data.json") + data.constants = extracted_data["constants"] + data.ram_addresses = extracted_data["misc_ram_addresses"] + data.rom_addresses = extracted_data["misc_rom_addresses"] + + location_attributes_json = load_json_data("locations.json") + + # Load/merge region json files + region_json_list = [] + for file in pkg_resources.resource_listdir(__name__, "data/regions"): + if not pkg_resources.resource_isdir(__name__, "data/regions/" + file): + region_json_list.append(load_json_data("regions/" + file)) + + regions_json = {} + for region_subset in region_json_list: + for region_name, region_json in region_subset.items(): + if region_name in regions_json: + raise AssertionError("Region [{region_name}] was defined multiple times") + regions_json[region_name] = region_json + + # Create region data + claimed_locations: Set[str] = set() + claimed_warps: Set[str] = set() + + data.regions = {} + for region_name, region_json in regions_json.items(): + new_region = RegionData(region_name) + + # Locations + for location_name in region_json["locations"]: + if location_name in claimed_locations: + raise AssertionError(f"Location [{location_name}] was claimed by multiple regions") + + location_json = extracted_data["locations"][location_name] + new_location = LocationData( + location_name, + location_attributes_json[location_name]["label"], + region_name, + location_json["default_item"], + location_json["rom_address"], + location_json["flag"], + frozenset(location_attributes_json[location_name]["tags"]) + ) + new_region.locations.append(location_name) + data.locations[location_name] = new_location + claimed_locations.add(location_name) + + new_region.locations.sort() + + # Events + for event in region_json["events"]: + new_region.events.append(EventData(event, region_name)) + + # Exits + for region_exit in region_json["exits"]: + new_region.exits.append(region_exit) + + # Warps + for encoded_warp in region_json["warps"]: + if encoded_warp in claimed_warps: + raise AssertionError(f"Warp [{encoded_warp}] was claimed by multiple regions") + new_region.warps.append(encoded_warp) + data.warps[encoded_warp] = Warp(encoded_warp, region_name) + claimed_warps.add(encoded_warp) + + new_region.warps.sort() + + data.regions[region_name] = new_region + + # Create item data + items_json = load_json_data("items.json") + + data.items = {} + for item_constant_name, attributes in items_json.items(): + item_classification = None + if attributes["classification"] == "PROGRESSION": + item_classification = ItemClassification.progression + elif attributes["classification"] == "USEFUL": + item_classification = ItemClassification.useful + elif attributes["classification"] == "FILLER": + item_classification = ItemClassification.filler + elif attributes["classification"] == "TRAP": + item_classification = ItemClassification.trap + else: + raise ValueError(f"Unknown classification {attributes['classification']} for item {item_constant_name}") + + data.items[data.constants[item_constant_name]] = ItemData( + attributes["label"], + data.constants[item_constant_name], + item_classification, + frozenset(attributes["tags"]) + ) + + # Create species data + + # Excludes extras like copies of Unown and special species values like SPECIES_EGG. + all_species: List[Tuple[str, str]] = [ + ("SPECIES_BULBASAUR", "Bulbasaur"), + ("SPECIES_IVYSAUR", "Ivysaur"), + ("SPECIES_VENUSAUR", "Venusaur"), + ("SPECIES_CHARMANDER", "Charmander"), + ("SPECIES_CHARMELEON", "Charmeleon"), + ("SPECIES_CHARIZARD", "Charizard"), + ("SPECIES_SQUIRTLE", "Squirtle"), + ("SPECIES_WARTORTLE", "Wartortle"), + ("SPECIES_BLASTOISE", "Blastoise"), + ("SPECIES_CATERPIE", "Caterpie"), + ("SPECIES_METAPOD", "Metapod"), + ("SPECIES_BUTTERFREE", "Butterfree"), + ("SPECIES_WEEDLE", "Weedle"), + ("SPECIES_KAKUNA", "Kakuna"), + ("SPECIES_BEEDRILL", "Beedrill"), + ("SPECIES_PIDGEY", "Pidgey"), + ("SPECIES_PIDGEOTTO", "Pidgeotto"), + ("SPECIES_PIDGEOT", "Pidgeot"), + ("SPECIES_RATTATA", "Rattata"), + ("SPECIES_RATICATE", "Raticate"), + ("SPECIES_SPEAROW", "Spearow"), + ("SPECIES_FEAROW", "Fearow"), + ("SPECIES_EKANS", "Ekans"), + ("SPECIES_ARBOK", "Arbok"), + ("SPECIES_PIKACHU", "Pikachu"), + ("SPECIES_RAICHU", "Raichu"), + ("SPECIES_SANDSHREW", "Sandshrew"), + ("SPECIES_SANDSLASH", "Sandslash"), + ("SPECIES_NIDORAN_F", "Nidoran Female"), + ("SPECIES_NIDORINA", "Nidorina"), + ("SPECIES_NIDOQUEEN", "Nidoqueen"), + ("SPECIES_NIDORAN_M", "Nidoran Male"), + ("SPECIES_NIDORINO", "Nidorino"), + ("SPECIES_NIDOKING", "Nidoking"), + ("SPECIES_CLEFAIRY", "Clefairy"), + ("SPECIES_CLEFABLE", "Clefable"), + ("SPECIES_VULPIX", "Vulpix"), + ("SPECIES_NINETALES", "Ninetales"), + ("SPECIES_JIGGLYPUFF", "Jigglypuff"), + ("SPECIES_WIGGLYTUFF", "Wigglytuff"), + ("SPECIES_ZUBAT", "Zubat"), + ("SPECIES_GOLBAT", "Golbat"), + ("SPECIES_ODDISH", "Oddish"), + ("SPECIES_GLOOM", "Gloom"), + ("SPECIES_VILEPLUME", "Vileplume"), + ("SPECIES_PARAS", "Paras"), + ("SPECIES_PARASECT", "Parasect"), + ("SPECIES_VENONAT", "Venonat"), + ("SPECIES_VENOMOTH", "Venomoth"), + ("SPECIES_DIGLETT", "Diglett"), + ("SPECIES_DUGTRIO", "Dugtrio"), + ("SPECIES_MEOWTH", "Meowth"), + ("SPECIES_PERSIAN", "Persian"), + ("SPECIES_PSYDUCK", "Psyduck"), + ("SPECIES_GOLDUCK", "Golduck"), + ("SPECIES_MANKEY", "Mankey"), + ("SPECIES_PRIMEAPE", "Primeape"), + ("SPECIES_GROWLITHE", "Growlithe"), + ("SPECIES_ARCANINE", "Arcanine"), + ("SPECIES_POLIWAG", "Poliwag"), + ("SPECIES_POLIWHIRL", "Poliwhirl"), + ("SPECIES_POLIWRATH", "Poliwrath"), + ("SPECIES_ABRA", "Abra"), + ("SPECIES_KADABRA", "Kadabra"), + ("SPECIES_ALAKAZAM", "Alakazam"), + ("SPECIES_MACHOP", "Machop"), + ("SPECIES_MACHOKE", "Machoke"), + ("SPECIES_MACHAMP", "Machamp"), + ("SPECIES_BELLSPROUT", "Bellsprout"), + ("SPECIES_WEEPINBELL", "Weepinbell"), + ("SPECIES_VICTREEBEL", "Victreebel"), + ("SPECIES_TENTACOOL", "Tentacool"), + ("SPECIES_TENTACRUEL", "Tentacruel"), + ("SPECIES_GEODUDE", "Geodude"), + ("SPECIES_GRAVELER", "Graveler"), + ("SPECIES_GOLEM", "Golem"), + ("SPECIES_PONYTA", "Ponyta"), + ("SPECIES_RAPIDASH", "Rapidash"), + ("SPECIES_SLOWPOKE", "Slowpoke"), + ("SPECIES_SLOWBRO", "Slowbro"), + ("SPECIES_MAGNEMITE", "Magnemite"), + ("SPECIES_MAGNETON", "Magneton"), + ("SPECIES_FARFETCHD", "Farfetch'd"), + ("SPECIES_DODUO", "Doduo"), + ("SPECIES_DODRIO", "Dodrio"), + ("SPECIES_SEEL", "Seel"), + ("SPECIES_DEWGONG", "Dewgong"), + ("SPECIES_GRIMER", "Grimer"), + ("SPECIES_MUK", "Muk"), + ("SPECIES_SHELLDER", "Shellder"), + ("SPECIES_CLOYSTER", "Cloyster"), + ("SPECIES_GASTLY", "Gastly"), + ("SPECIES_HAUNTER", "Haunter"), + ("SPECIES_GENGAR", "Gengar"), + ("SPECIES_ONIX", "Onix"), + ("SPECIES_DROWZEE", "Drowzee"), + ("SPECIES_HYPNO", "Hypno"), + ("SPECIES_KRABBY", "Krabby"), + ("SPECIES_KINGLER", "Kingler"), + ("SPECIES_VOLTORB", "Voltorb"), + ("SPECIES_ELECTRODE", "Electrode"), + ("SPECIES_EXEGGCUTE", "Exeggcute"), + ("SPECIES_EXEGGUTOR", "Exeggutor"), + ("SPECIES_CUBONE", "Cubone"), + ("SPECIES_MAROWAK", "Marowak"), + ("SPECIES_HITMONLEE", "Hitmonlee"), + ("SPECIES_HITMONCHAN", "Hitmonchan"), + ("SPECIES_LICKITUNG", "Lickitung"), + ("SPECIES_KOFFING", "Koffing"), + ("SPECIES_WEEZING", "Weezing"), + ("SPECIES_RHYHORN", "Rhyhorn"), + ("SPECIES_RHYDON", "Rhydon"), + ("SPECIES_CHANSEY", "Chansey"), + ("SPECIES_TANGELA", "Tangela"), + ("SPECIES_KANGASKHAN", "Kangaskhan"), + ("SPECIES_HORSEA", "Horsea"), + ("SPECIES_SEADRA", "Seadra"), + ("SPECIES_GOLDEEN", "Goldeen"), + ("SPECIES_SEAKING", "Seaking"), + ("SPECIES_STARYU", "Staryu"), + ("SPECIES_STARMIE", "Starmie"), + ("SPECIES_MR_MIME", "Mr. Mime"), + ("SPECIES_SCYTHER", "Scyther"), + ("SPECIES_JYNX", "Jynx"), + ("SPECIES_ELECTABUZZ", "Electabuzz"), + ("SPECIES_MAGMAR", "Magmar"), + ("SPECIES_PINSIR", "Pinsir"), + ("SPECIES_TAUROS", "Tauros"), + ("SPECIES_MAGIKARP", "Magikarp"), + ("SPECIES_GYARADOS", "Gyarados"), + ("SPECIES_LAPRAS", "Lapras"), + ("SPECIES_DITTO", "Ditto"), + ("SPECIES_EEVEE", "Eevee"), + ("SPECIES_VAPOREON", "Vaporeon"), + ("SPECIES_JOLTEON", "Jolteon"), + ("SPECIES_FLAREON", "Flareon"), + ("SPECIES_PORYGON", "Porygon"), + ("SPECIES_OMANYTE", "Omanyte"), + ("SPECIES_OMASTAR", "Omastar"), + ("SPECIES_KABUTO", "Kabuto"), + ("SPECIES_KABUTOPS", "Kabutops"), + ("SPECIES_AERODACTYL", "Aerodactyl"), + ("SPECIES_SNORLAX", "Snorlax"), + ("SPECIES_ARTICUNO", "Articuno"), + ("SPECIES_ZAPDOS", "Zapdos"), + ("SPECIES_MOLTRES", "Moltres"), + ("SPECIES_DRATINI", "Dratini"), + ("SPECIES_DRAGONAIR", "Dragonair"), + ("SPECIES_DRAGONITE", "Dragonite"), + ("SPECIES_MEWTWO", "Mewtwo"), + ("SPECIES_MEW", "Mew"), + ("SPECIES_CHIKORITA", "Chikorita"), + ("SPECIES_BAYLEEF", "Bayleaf"), + ("SPECIES_MEGANIUM", "Meganium"), + ("SPECIES_CYNDAQUIL", "Cindaquil"), + ("SPECIES_QUILAVA", "Quilava"), + ("SPECIES_TYPHLOSION", "Typhlosion"), + ("SPECIES_TOTODILE", "Totodile"), + ("SPECIES_CROCONAW", "Croconaw"), + ("SPECIES_FERALIGATR", "Feraligatr"), + ("SPECIES_SENTRET", "Sentret"), + ("SPECIES_FURRET", "Furret"), + ("SPECIES_HOOTHOOT", "Hoothoot"), + ("SPECIES_NOCTOWL", "Noctowl"), + ("SPECIES_LEDYBA", "Ledyba"), + ("SPECIES_LEDIAN", "Ledian"), + ("SPECIES_SPINARAK", "Spinarak"), + ("SPECIES_ARIADOS", "Ariados"), + ("SPECIES_CROBAT", "Crobat"), + ("SPECIES_CHINCHOU", "Chinchou"), + ("SPECIES_LANTURN", "Lanturn"), + ("SPECIES_PICHU", "Pichu"), + ("SPECIES_CLEFFA", "Cleffa"), + ("SPECIES_IGGLYBUFF", "Igglybuff"), + ("SPECIES_TOGEPI", "Togepi"), + ("SPECIES_TOGETIC", "Togetic"), + ("SPECIES_NATU", "Natu"), + ("SPECIES_XATU", "Xatu"), + ("SPECIES_MAREEP", "Mareep"), + ("SPECIES_FLAAFFY", "Flaafy"), + ("SPECIES_AMPHAROS", "Ampharos"), + ("SPECIES_BELLOSSOM", "Bellossom"), + ("SPECIES_MARILL", "Marill"), + ("SPECIES_AZUMARILL", "Azumarill"), + ("SPECIES_SUDOWOODO", "Sudowoodo"), + ("SPECIES_POLITOED", "Politoed"), + ("SPECIES_HOPPIP", "Hoppip"), + ("SPECIES_SKIPLOOM", "Skiploom"), + ("SPECIES_JUMPLUFF", "Jumpluff"), + ("SPECIES_AIPOM", "Aipom"), + ("SPECIES_SUNKERN", "Sunkern"), + ("SPECIES_SUNFLORA", "Sunflora"), + ("SPECIES_YANMA", "Yanma"), + ("SPECIES_WOOPER", "Wooper"), + ("SPECIES_QUAGSIRE", "Quagsire"), + ("SPECIES_ESPEON", "Espeon"), + ("SPECIES_UMBREON", "Umbreon"), + ("SPECIES_MURKROW", "Murkrow"), + ("SPECIES_SLOWKING", "Slowking"), + ("SPECIES_MISDREAVUS", "Misdreavus"), + ("SPECIES_UNOWN", "Unown"), + ("SPECIES_WOBBUFFET", "Wobbuffet"), + ("SPECIES_GIRAFARIG", "Girafarig"), + ("SPECIES_PINECO", "Pineco"), + ("SPECIES_FORRETRESS", "Forretress"), + ("SPECIES_DUNSPARCE", "Dunsparce"), + ("SPECIES_GLIGAR", "Gligar"), + ("SPECIES_STEELIX", "Steelix"), + ("SPECIES_SNUBBULL", "Snubbull"), + ("SPECIES_GRANBULL", "Granbull"), + ("SPECIES_QWILFISH", "Qwilfish"), + ("SPECIES_SCIZOR", "Scizor"), + ("SPECIES_SHUCKLE", "Shuckle"), + ("SPECIES_HERACROSS", "Heracross"), + ("SPECIES_SNEASEL", "Sneasel"), + ("SPECIES_TEDDIURSA", "Teddiursa"), + ("SPECIES_URSARING", "Ursaring"), + ("SPECIES_SLUGMA", "Slugma"), + ("SPECIES_MAGCARGO", "Magcargo"), + ("SPECIES_SWINUB", "Swinub"), + ("SPECIES_PILOSWINE", "Piloswine"), + ("SPECIES_CORSOLA", "Corsola"), + ("SPECIES_REMORAID", "Remoraid"), + ("SPECIES_OCTILLERY", "Octillery"), + ("SPECIES_DELIBIRD", "Delibird"), + ("SPECIES_MANTINE", "Mantine"), + ("SPECIES_SKARMORY", "Skarmory"), + ("SPECIES_HOUNDOUR", "Houndour"), + ("SPECIES_HOUNDOOM", "Houndoom"), + ("SPECIES_KINGDRA", "Kingdra"), + ("SPECIES_PHANPY", "Phanpy"), + ("SPECIES_DONPHAN", "Donphan"), + ("SPECIES_PORYGON2", "Porygon2"), + ("SPECIES_STANTLER", "Stantler"), + ("SPECIES_SMEARGLE", "Smeargle"), + ("SPECIES_TYROGUE", "Tyrogue"), + ("SPECIES_HITMONTOP", "Hitmontop"), + ("SPECIES_SMOOCHUM", "Smoochum"), + ("SPECIES_ELEKID", "Elekid"), + ("SPECIES_MAGBY", "Magby"), + ("SPECIES_MILTANK", "Miltank"), + ("SPECIES_BLISSEY", "Blissey"), + ("SPECIES_RAIKOU", "Raikou"), + ("SPECIES_ENTEI", "Entei"), + ("SPECIES_SUICUNE", "Suicune"), + ("SPECIES_LARVITAR", "Larvitar"), + ("SPECIES_PUPITAR", "Pupitar"), + ("SPECIES_TYRANITAR", "Tyranitar"), + ("SPECIES_LUGIA", "Lugia"), + ("SPECIES_HO_OH", "Ho-oh"), + ("SPECIES_CELEBI", "Celebi"), + ("SPECIES_TREECKO", "Treecko"), + ("SPECIES_GROVYLE", "Grovyle"), + ("SPECIES_SCEPTILE", "Sceptile"), + ("SPECIES_TORCHIC", "Torchic"), + ("SPECIES_COMBUSKEN", "Combusken"), + ("SPECIES_BLAZIKEN", "Blaziken"), + ("SPECIES_MUDKIP", "Mudkip"), + ("SPECIES_MARSHTOMP", "Marshtomp"), + ("SPECIES_SWAMPERT", "Swampert"), + ("SPECIES_POOCHYENA", "Poochyena"), + ("SPECIES_MIGHTYENA", "Mightyena"), + ("SPECIES_ZIGZAGOON", "Zigzagoon"), + ("SPECIES_LINOONE", "Linoon"), + ("SPECIES_WURMPLE", "Wurmple"), + ("SPECIES_SILCOON", "Silcoon"), + ("SPECIES_BEAUTIFLY", "Beautifly"), + ("SPECIES_CASCOON", "Cascoon"), + ("SPECIES_DUSTOX", "Dustox"), + ("SPECIES_LOTAD", "Lotad"), + ("SPECIES_LOMBRE", "Lombre"), + ("SPECIES_LUDICOLO", "Ludicolo"), + ("SPECIES_SEEDOT", "Seedot"), + ("SPECIES_NUZLEAF", "Nuzleaf"), + ("SPECIES_SHIFTRY", "Shiftry"), + ("SPECIES_NINCADA", "Nincada"), + ("SPECIES_NINJASK", "Ninjask"), + ("SPECIES_SHEDINJA", "Shedinja"), + ("SPECIES_TAILLOW", "Taillow"), + ("SPECIES_SWELLOW", "Swellow"), + ("SPECIES_SHROOMISH", "Shroomish"), + ("SPECIES_BRELOOM", "Breloom"), + ("SPECIES_SPINDA", "Spinda"), + ("SPECIES_WINGULL", "Wingull"), + ("SPECIES_PELIPPER", "Pelipper"), + ("SPECIES_SURSKIT", "Surskit"), + ("SPECIES_MASQUERAIN", "Masquerain"), + ("SPECIES_WAILMER", "Wailmer"), + ("SPECIES_WAILORD", "Wailord"), + ("SPECIES_SKITTY", "Skitty"), + ("SPECIES_DELCATTY", "Delcatty"), + ("SPECIES_KECLEON", "Kecleon"), + ("SPECIES_BALTOY", "Baltoy"), + ("SPECIES_CLAYDOL", "Claydol"), + ("SPECIES_NOSEPASS", "Nosepass"), + ("SPECIES_TORKOAL", "Torkoal"), + ("SPECIES_SABLEYE", "Sableye"), + ("SPECIES_BARBOACH", "Barboach"), + ("SPECIES_WHISCASH", "Whiscash"), + ("SPECIES_LUVDISC", "Luvdisc"), + ("SPECIES_CORPHISH", "Corphish"), + ("SPECIES_CRAWDAUNT", "Crawdaunt"), + ("SPECIES_FEEBAS", "Feebas"), + ("SPECIES_MILOTIC", "Milotic"), + ("SPECIES_CARVANHA", "Carvanha"), + ("SPECIES_SHARPEDO", "Sharpedo"), + ("SPECIES_TRAPINCH", "Trapinch"), + ("SPECIES_VIBRAVA", "Vibrava"), + ("SPECIES_FLYGON", "Flygon"), + ("SPECIES_MAKUHITA", "Makuhita"), + ("SPECIES_HARIYAMA", "Hariyama"), + ("SPECIES_ELECTRIKE", "Electrike"), + ("SPECIES_MANECTRIC", "Manectric"), + ("SPECIES_NUMEL", "Numel"), + ("SPECIES_CAMERUPT", "Camerupt"), + ("SPECIES_SPHEAL", "Spheal"), + ("SPECIES_SEALEO", "Sealeo"), + ("SPECIES_WALREIN", "Walrein"), + ("SPECIES_CACNEA", "Cacnea"), + ("SPECIES_CACTURNE", "Cacturne"), + ("SPECIES_SNORUNT", "Snorunt"), + ("SPECIES_GLALIE", "Glalie"), + ("SPECIES_LUNATONE", "Lunatone"), + ("SPECIES_SOLROCK", "Solrock"), + ("SPECIES_AZURILL", "Azurill"), + ("SPECIES_SPOINK", "Spoink"), + ("SPECIES_GRUMPIG", "Grumpig"), + ("SPECIES_PLUSLE", "Plusle"), + ("SPECIES_MINUN", "Minun"), + ("SPECIES_MAWILE", "Mawile"), + ("SPECIES_MEDITITE", "Meditite"), + ("SPECIES_MEDICHAM", "Medicham"), + ("SPECIES_SWABLU", "Swablu"), + ("SPECIES_ALTARIA", "Altaria"), + ("SPECIES_WYNAUT", "Wynaut"), + ("SPECIES_DUSKULL", "Duskull"), + ("SPECIES_DUSCLOPS", "Dusclops"), + ("SPECIES_ROSELIA", "Roselia"), + ("SPECIES_SLAKOTH", "Slakoth"), + ("SPECIES_VIGOROTH", "Vigoroth"), + ("SPECIES_SLAKING", "Slaking"), + ("SPECIES_GULPIN", "Gulpin"), + ("SPECIES_SWALOT", "Swalot"), + ("SPECIES_TROPIUS", "Tropius"), + ("SPECIES_WHISMUR", "Whismur"), + ("SPECIES_LOUDRED", "Loudred"), + ("SPECIES_EXPLOUD", "Exploud"), + ("SPECIES_CLAMPERL", "Clamperl"), + ("SPECIES_HUNTAIL", "Huntail"), + ("SPECIES_GOREBYSS", "Gorebyss"), + ("SPECIES_ABSOL", "Absol"), + ("SPECIES_SHUPPET", "Shuppet"), + ("SPECIES_BANETTE", "Banette"), + ("SPECIES_SEVIPER", "Seviper"), + ("SPECIES_ZANGOOSE", "Zangoose"), + ("SPECIES_RELICANTH", "Relicanth"), + ("SPECIES_ARON", "Aron"), + ("SPECIES_LAIRON", "Lairon"), + ("SPECIES_AGGRON", "Aggron"), + ("SPECIES_CASTFORM", "Castform"), + ("SPECIES_VOLBEAT", "Volbeat"), + ("SPECIES_ILLUMISE", "Illumise"), + ("SPECIES_LILEEP", "Lileep"), + ("SPECIES_CRADILY", "Cradily"), + ("SPECIES_ANORITH", "Anorith"), + ("SPECIES_ARMALDO", "Armaldo"), + ("SPECIES_RALTS", "Ralts"), + ("SPECIES_KIRLIA", "Kirlia"), + ("SPECIES_GARDEVOIR", "Gardevoir"), + ("SPECIES_BAGON", "Bagon"), + ("SPECIES_SHELGON", "Shelgon"), + ("SPECIES_SALAMENCE", "Salamence"), + ("SPECIES_BELDUM", "Beldum"), + ("SPECIES_METANG", "Metang"), + ("SPECIES_METAGROSS", "Metagross"), + ("SPECIES_REGIROCK", "Regirock"), + ("SPECIES_REGICE", "Regice"), + ("SPECIES_REGISTEEL", "Registeel"), + ("SPECIES_KYOGRE", "Kyogre"), + ("SPECIES_GROUDON", "Groudon"), + ("SPECIES_RAYQUAZA", "Rayquaza"), + ("SPECIES_LATIAS", "Latias"), + ("SPECIES_LATIOS", "Latios"), + ("SPECIES_JIRACHI", "Jirachi"), + ("SPECIES_DEOXYS", "Deoxys"), + ("SPECIES_CHIMECHO", "Chimecho") + ] + + species_list: List[SpeciesData] = [] + max_species_id = 0 + for species_name, species_label in all_species: + species_id = data.constants[species_name] + max_species_id = max(species_id, max_species_id) + species_data = extracted_data["species"][species_id] + + learnset = [LearnsetMove(item["level"], item["move_id"]) for item in species_data["learnset"]["moves"]] + + species_list.append(SpeciesData( + species_name, + species_label, + species_id, + BaseStats( + species_data["base_stats"][0], + species_data["base_stats"][1], + species_data["base_stats"][2], + species_data["base_stats"][3], + species_data["base_stats"][4], + species_data["base_stats"][5] + ), + (species_data["types"][0], species_data["types"][1]), + (species_data["abilities"][0], species_data["abilities"][1]), + [EvolutionData( + _str_to_evolution_method(evolution_json["method"]), + evolution_json["param"], + evolution_json["species"], + ) for evolution_json in species_data["evolutions"]], + None, + species_data["catch_rate"], + learnset, + int(species_data["tmhm_learnset"], 16), + species_data["learnset"]["rom_address"], + species_data["rom_address"] + )) + + data.species = [None for i in range(max_species_id + 1)] + + for species_data in species_list: + data.species[species_data.species_id] = species_data + + for species in data.species: + if species is not None: + for evolution in species.evolutions: + data.species[evolution.species_id].pre_evolution = species.species_id + + # Create static encounter data + for static_encounter_json in extracted_data["static_encounters"]: + data.static_encounters.append(StaticEncounterData( + static_encounter_json["species"], + static_encounter_json["rom_address"] + )) + + # TM moves + data.tmhm_moves = extracted_data["tmhm_moves"] + + # Create ability data + data.abilities = [AbilityData(data.constants[ability_data[0]], ability_data[1]) for ability_data in [ + ("ABILITY_STENCH", "Stench"), + ("ABILITY_DRIZZLE", "Drizzle"), + ("ABILITY_SPEED_BOOST", "Speed Boost"), + ("ABILITY_BATTLE_ARMOR", "Battle Armor"), + ("ABILITY_STURDY", "Sturdy"), + ("ABILITY_DAMP", "Damp"), + ("ABILITY_LIMBER", "Limber"), + ("ABILITY_SAND_VEIL", "Sand Veil"), + ("ABILITY_STATIC", "Static"), + ("ABILITY_VOLT_ABSORB", "Volt Absorb"), + ("ABILITY_WATER_ABSORB", "Water Absorb"), + ("ABILITY_OBLIVIOUS", "Oblivious"), + ("ABILITY_CLOUD_NINE", "Cloud Nine"), + ("ABILITY_COMPOUND_EYES", "Compound Eyes"), + ("ABILITY_INSOMNIA", "Insomnia"), + ("ABILITY_COLOR_CHANGE", "Color Change"), + ("ABILITY_IMMUNITY", "Immunity"), + ("ABILITY_FLASH_FIRE", "Flash Fire"), + ("ABILITY_SHIELD_DUST", "Shield Dust"), + ("ABILITY_OWN_TEMPO", "Own Tempo"), + ("ABILITY_SUCTION_CUPS", "Suction Cups"), + ("ABILITY_INTIMIDATE", "Intimidate"), + ("ABILITY_SHADOW_TAG", "Shadow Tag"), + ("ABILITY_ROUGH_SKIN", "Rough Skin"), + ("ABILITY_WONDER_GUARD", "Wonder Guard"), + ("ABILITY_LEVITATE", "Levitate"), + ("ABILITY_EFFECT_SPORE", "Effect Spore"), + ("ABILITY_SYNCHRONIZE", "Synchronize"), + ("ABILITY_CLEAR_BODY", "Clear Body"), + ("ABILITY_NATURAL_CURE", "Natural Cure"), + ("ABILITY_LIGHTNING_ROD", "Lightning Rod"), + ("ABILITY_SERENE_GRACE", "Serene Grace"), + ("ABILITY_SWIFT_SWIM", "Swift Swim"), + ("ABILITY_CHLOROPHYLL", "Chlorophyll"), + ("ABILITY_ILLUMINATE", "Illuminate"), + ("ABILITY_TRACE", "Trace"), + ("ABILITY_HUGE_POWER", "Huge Power"), + ("ABILITY_POISON_POINT", "Poison Point"), + ("ABILITY_INNER_FOCUS", "Inner Focus"), + ("ABILITY_MAGMA_ARMOR", "Magma Armor"), + ("ABILITY_WATER_VEIL", "Water Veil"), + ("ABILITY_MAGNET_PULL", "Magnet Pull"), + ("ABILITY_SOUNDPROOF", "Soundproof"), + ("ABILITY_RAIN_DISH", "Rain Dish"), + ("ABILITY_SAND_STREAM", "Sand Stream"), + ("ABILITY_PRESSURE", "Pressure"), + ("ABILITY_THICK_FAT", "Thick Fat"), + ("ABILITY_EARLY_BIRD", "Early Bird"), + ("ABILITY_FLAME_BODY", "Flame Body"), + ("ABILITY_RUN_AWAY", "Run Away"), + ("ABILITY_KEEN_EYE", "Keen Eye"), + ("ABILITY_HYPER_CUTTER", "Hyper Cutter"), + ("ABILITY_PICKUP", "Pickup"), + ("ABILITY_TRUANT", "Truant"), + ("ABILITY_HUSTLE", "Hustle"), + ("ABILITY_CUTE_CHARM", "Cute Charm"), + ("ABILITY_PLUS", "Plus"), + ("ABILITY_MINUS", "Minus"), + ("ABILITY_FORECAST", "Forecast"), + ("ABILITY_STICKY_HOLD", "Sticky Hold"), + ("ABILITY_SHED_SKIN", "Shed Skin"), + ("ABILITY_GUTS", "Guts"), + ("ABILITY_MARVEL_SCALE", "Marvel Scale"), + ("ABILITY_LIQUID_OOZE", "Liquid Ooze"), + ("ABILITY_OVERGROW", "Overgrow"), + ("ABILITY_BLAZE", "Blaze"), + ("ABILITY_TORRENT", "Torrent"), + ("ABILITY_SWARM", "Swarm"), + ("ABILITY_ROCK_HEAD", "Rock Head"), + ("ABILITY_DROUGHT", "Drought"), + ("ABILITY_ARENA_TRAP", "Arena Trap"), + ("ABILITY_VITAL_SPIRIT", "Vital Spirit"), + ("ABILITY_WHITE_SMOKE", "White Smoke"), + ("ABILITY_PURE_POWER", "Pure Power"), + ("ABILITY_SHELL_ARMOR", "Shell Armor"), + ("ABILITY_CACOPHONY", "Cacophony"), + ("ABILITY_AIR_LOCK", "Air Lock") + ]] + + # Create map data + for map_name, map_json in extracted_data["maps"].items(): + land_encounters = None + water_encounters = None + fishing_encounters = None + + if map_json["land_encounters"] is not None: + land_encounters = EncounterTableData( + map_json["land_encounters"]["encounter_slots"], + map_json["land_encounters"]["rom_address"] + ) + if map_json["water_encounters"] is not None: + water_encounters = EncounterTableData( + map_json["water_encounters"]["encounter_slots"], + map_json["water_encounters"]["rom_address"] + ) + if map_json["fishing_encounters"] is not None: + fishing_encounters = EncounterTableData( + map_json["fishing_encounters"]["encounter_slots"], + map_json["fishing_encounters"]["rom_address"] + ) + + data.maps.append(MapData( + map_name, + land_encounters, + water_encounters, + fishing_encounters + )) + + data.maps.sort(key=lambda map: map.name) + + # Create warp map + for warp, destination in extracted_data["warps"].items(): + data.warp_map[warp] = None if destination == "" else destination + + if encoded_warp not in data.warp_map: + data.warp_map[encoded_warp] = None + + # Create trainer data + for i, trainer_json in enumerate(extracted_data["trainers"]): + party_json = trainer_json["party"] + pokemon_data_type = _str_to_pokemon_data_type(trainer_json["pokemon_data_type"]) + data.trainers.append(TrainerData( + i, + TrainerPartyData( + [TrainerPokemonData( + p["species"], + p["level"], + (p["moves"][0], p["moves"][1], p["moves"][2], p["moves"][3]) + ) for p in party_json], + pokemon_data_type, + trainer_json["party_rom_address"] + ), + trainer_json["rom_address"], + trainer_json["battle_script_rom_address"] + )) + + +_init() diff --git a/worlds/pokemon_emerald/data/README.md b/worlds/pokemon_emerald/data/README.md new file mode 100644 index 000000000000..a7c5d3f2932d --- /dev/null +++ b/worlds/pokemon_emerald/data/README.md @@ -0,0 +1,99 @@ +## `regions/` + +These define regions, connections, and where locations are. If you know what you're doing, it should be pretty clear how +this works by taking a quick look through the files. The rest of this section is pretty verbose to cover everything. Not +to say you shouldn't read it, but the tl;dr is: + +- Every map, even trivial ones, gets a region definition, and they cannot be coalesced (because of warp rando) +- Stick to the naming convention for regions and events (look at Route 103 and Petalburg City for guidance) +- Locations and warps can only be claimed by one region +- Events are declared here + +A `Map`, which you will see referenced in `parent_map` attribute in the region JSON, is an id from the source code. +`Map`s are sets of tiles, encounters, warps, events, and so on. Route 103, Littleroot Town, the Oldale Town Mart, the +second floor of Devon Corp, and each level of Victory Road are all examples of `Map`s. You transition between `Map`s by +stepping on a warp (warp pads, doorways, etc...) or walking over a border between `Map`s in the overworld. Some warps +don't go to a different `Map`. + +Regions usually describe physical areas which are subsets of a `Map`. Every `Map` must have one or more defined regions. +A region should not contain area from more than one `Map`. We'll need to draw those lines now even when there is no +logical boundary (like between two the first and second floors of your rival's house), for warp rando. + +Most `Map`s have been split into multiple regions. In the example below, `MAP_ROUTE103` was split into +`REGION_ROUTE_103/WEST`, `REGION_ROUTE_103/WATER`, and `REGION_ROUTE_103/EAST` (this document may be out of date; the +example is demonstrative). Keeping the name consistent with the `Map` name and adding a label suffix for the subarea +makes it clearer where we are in the world and where within a `Map` we're describing. + +Every region (except `Menu`) is configured here. All files in this directory are combined with each other at runtime, +and are only split and ordered for organization. Regions defined in `data/regions/unused` are entirely unused because +they're not yet reachable in the randomizer. They're there for future reference in case we want to pull those maps in +later. Any locations or warps in here should be ignored. Data for a single region looks like this: + +```json +"REGION_ROUTE103/EAST": { + "parent_map": "MAP_ROUTE103", + "locations": [ + "ITEM_ROUTE_103_GUARD_SPEC", + "ITEM_ROUTE_103_PP_UP" + ], + "events": [], + "exits": [ + "REGION_ROUTE103/WATER", + "REGION_ROUTE110/MAIN" + ], + "warps": [ + "MAP_ROUTE103:0/MAP_ALTERING_CAVE:0" + ] +} +``` + +- `[key]`: The name of the object, in this case `REGION_ROUTE103/EAST`, should be the value of `parent_map` where the +`MAP` prefix is replaced with `REGION`. Then there should be a following `/` and a label describing this specific region +within the `Map`. This is not enforced or required by the code, but it makes things much more clear. +- `parent_map`: The name of the `Map` this region exists under. It can relate this region to information like encounter +tables. +- `locations`: Locations contained within this region. This can be anything from an item on the ground to a badge to a +gift from an NPC. Locations themselves are defined in `data/extracted_data.json`, and the names used here should come +directly from it. +- `events`: Events that can be completed in this region. Defeating a gym leader or Aqua/Magma team leader, for example, +can trigger story progression and unblock roads and buildings. Events are defined here and nowhere else, and access +rules are set in `rules.py`. +- `exits`: Names of regions that can be directly accessed from this one. Most often regions within the same `Map`, +neighboring maps in the overworld, or transitions from using HM08 Dive. Most connections between maps/regions come from +warps. Any region in this list should be defined somewhere in `data/regions`. +- `warps`: Warp events contained within this region. Warps are defined in `data/extracted_data.json`, and must exist +there to be referenced here. More on warps in [../README.md](../README.md). + +Think of this data as defining which regions are "claiming" a given location, event, or warp. No more than one region +may claim ownership of a location. Even if some "thing" may happen in two different regions and set the same flag, they +should be defined as two different events and anything conditional on said "thing" happening can check whether either of +the two events is accessible. (e.g. Interacting with the Poke Ball in your rival's room and going back downstairs will +both trigger a conversation with them which enables you to rescue Professor Birch. It's the same "thing" on two +different `Map`s.) + +Conceptually, you shouldn't have to "add" any new regions. You should only have to "split" existing regions. When you +split a region, make sure to correctly reassign `locations`, `events`, `exits`, and `warps` according to which new +region they now exist in. Make sure to define new `exits` to link the new regions to each other if applicable. And +especially remember to rename incoming `exits` defined in other regions which are still pointing to the pre-split +region. `sanity_check.py` should catch you if there are other regions that point to a region that no longer exists, but +if one of your newly-split regions still has the same name as the original, it won't be detected and you may find that +things aren't connected correctly. + +## `extracted_data.json` + +DO NOT TOUCH + +Contains data automatically pulled from the base rom and its source code when it is built. There should be no reason to +manually modify it. Data from this file is piped through `data.py` to create a data object that's more useful and +complete. + +## `items.json` + +A map from items as defined in the `constants` in `extracted_data.json` to useful info like a human-friendly label, the +type of progression it enables, and tags to associate. There are many unused items and extra helper constants in +`extracted_data.json`, so this file contains an exhaustive list of items which can actually be found in the modded game. + +## `locations.json` + +Similar to `items.json`, this associates locations with human-friendly labels and tags that are used for filtering. Any +locations claimed by any region need an entry here. diff --git a/worlds/pokemon_emerald/data/base_patch.bsdiff4 b/worlds/pokemon_emerald/data/base_patch.bsdiff4 new file mode 100644 index 000000000000..c1843904a9ca Binary files /dev/null and b/worlds/pokemon_emerald/data/base_patch.bsdiff4 differ diff --git a/worlds/pokemon_emerald/data/extracted_data.json b/worlds/pokemon_emerald/data/extracted_data.json new file mode 100644 index 000000000000..6174cd4885ee --- /dev/null +++ b/worlds/pokemon_emerald/data/extracted_data.json @@ -0,0 +1 @@ +{"_comment":"DO NOT MODIFY. This file was auto-generated. Your changes will likely be overwritten.","_rom_name":"pokemon emerald version / AP 2","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,"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_BATTLED_DEOXYS":429,"FLAG_BATTLE_FRONTIER_TRADE_DONE":156,"FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS":313,"FLAG_BEAUTY_PAINTING_MADE":161,"FLAG_BETTER_SHOPS_ENABLED":483,"FLAG_BIRCH_AIDE_MET":88,"FLAG_CANCEL_BATTLE_ROOM_CHALLENGE":119,"FLAG_CAUGHT_HO_OH":146,"FLAG_CAUGHT_LATIAS_OR_LATIOS":457,"FLAG_CAUGHT_LUGIA":145,"FLAG_CAUGHT_MEW":458,"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_KYOGRE":446,"FLAG_DEFEATED_LATIAS_OR_LATIOS":456,"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_ROCK_COMPLETE":2260,"FLAG_DEVON_GOODS_STOLEN":142,"FLAG_DOCK_REJECTED_DEVON_GOODS":148,"FLAG_DONT_TRANSITION_MUSIC":16385,"FLAG_DUMMY_LATIAS":33,"FLAG_DUMMY_LATIOS":32,"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_ENCOUNTERED_LATIAS_OR_LATIOS":206,"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_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_TM24_FROM_WATTSON":209,"FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT":111,"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_TM32":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_LEGEND_MON_CAVE_OF_ORIGIN":825,"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_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_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":482,"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_KECLEON_1":989,"FLAG_HIDE_ROUTE_119_KECLEON_2":990,"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_120_GABBY_AND_TY_1":798,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2":902,"FLAG_HIDE_ROUTE_120_KECLEON_1":982,"FLAG_HIDE_ROUTE_120_KECLEON_2":985,"FLAG_HIDE_ROUTE_120_KECLEON_3":986,"FLAG_HIDE_ROUTE_120_KECLEON_4":987,"FLAG_HIDE_ROUTE_120_KECLEON_5":988,"FLAG_HIDE_ROUTE_120_KECLEON_BRIDGE":970,"FLAG_HIDE_ROUTE_120_KECLEON_BRIDGE_SHADOW":981,"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_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_TM18":1102,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":1101,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_4_SCANNER":1078,"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_TM13":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_TM06":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_TM23":1044,"FLAG_ITEM_METEOR_FALLS_B1F_2R_TM02":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_TM30":1089,"FLAG_ITEM_MT_PYRE_EXTERIOR_MAX_POTION":1073,"FLAG_ITEM_MT_PYRE_EXTERIOR_TM48":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_TM37":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_TM01":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_RARE_CANDY":1033,"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_TM22":1094,"FLAG_ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":1170,"FLAG_ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":1131,"FLAG_ITEM_SCORCHED_SLAB_TM11":1079,"FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM26":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_TM07":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_TM29":1086,"FLAG_ITEM_VICTORY_ROAD_B2F_FULL_HEAL":1088,"FLAG_KECLEON_FLED_FORTREE":295,"FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN":129,"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_LATIOS_OR_LATIAS_ROAMING":255,"FLAG_LEGENDARIES_IN_SOOTOPOLIS":83,"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_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_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_EXP_SHARE":272,"FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK":299,"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_HM01":137,"FLAG_RECEIVED_HM02":110,"FLAG_RECEIVED_HM03":122,"FLAG_RECEIVED_HM04":106,"FLAG_RECEIVED_HM05":109,"FLAG_RECEIVED_HM06":107,"FLAG_RECEIVED_HM07":312,"FLAG_RECEIVED_HM08":123,"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_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_TM03":172,"FLAG_RECEIVED_TM04":171,"FLAG_RECEIVED_TM05":231,"FLAG_RECEIVED_TM08":166,"FLAG_RECEIVED_TM09":262,"FLAG_RECEIVED_TM10":264,"FLAG_RECEIVED_TM19":232,"FLAG_RECEIVED_TM21":1179,"FLAG_RECEIVED_TM27":229,"FLAG_RECEIVED_TM27_2":1178,"FLAG_RECEIVED_TM28":261,"FLAG_RECEIVED_TM31":121,"FLAG_RECEIVED_TM34":167,"FLAG_RECEIVED_TM36":230,"FLAG_RECEIVED_TM39":165,"FLAG_RECEIVED_TM40":170,"FLAG_RECEIVED_TM41":265,"FLAG_RECEIVED_TM42":169,"FLAG_RECEIVED_TM44":234,"FLAG_RECEIVED_TM45":235,"FLAG_RECEIVED_TM46":269,"FLAG_RECEIVED_TM47":1175,"FLAG_RECEIVED_TM49":260,"FLAG_RECEIVED_TM50":168,"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_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_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_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_HIPSTER_MEET":2150,"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_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_UNKNOWN_0x363":867,"FLAG_UNKNOWN_0x393":915,"FLAG_UNUSED_0x022":34,"FLAG_UNUSED_0x023":35,"FLAG_UNUSED_0x024":36,"FLAG_UNUSED_0x025":37,"FLAG_UNUSED_0x026":38,"FLAG_UNUSED_0x027":39,"FLAG_UNUSED_0x028":40,"FLAG_UNUSED_0x029":41,"FLAG_UNUSED_0x02A":42,"FLAG_UNUSED_0x02B":43,"FLAG_UNUSED_0x02C":44,"FLAG_UNUSED_0x02D":45,"FLAG_UNUSED_0x02E":46,"FLAG_UNUSED_0x02F":47,"FLAG_UNUSED_0x030":48,"FLAG_UNUSED_0x031":49,"FLAG_UNUSED_0x032":50,"FLAG_UNUSED_0x033":51,"FLAG_UNUSED_0x034":52,"FLAG_UNUSED_0x035":53,"FLAG_UNUSED_0x036":54,"FLAG_UNUSED_0x037":55,"FLAG_UNUSED_0x038":56,"FLAG_UNUSED_0x039":57,"FLAG_UNUSED_0x03A":58,"FLAG_UNUSED_0x03B":59,"FLAG_UNUSED_0x03C":60,"FLAG_UNUSED_0x03D":61,"FLAG_UNUSED_0x03E":62,"FLAG_UNUSED_0x03F":63,"FLAG_UNUSED_0x040":64,"FLAG_UNUSED_0x041":65,"FLAG_UNUSED_0x042":66,"FLAG_UNUSED_0x043":67,"FLAG_UNUSED_0x044":68,"FLAG_UNUSED_0x045":69,"FLAG_UNUSED_0x046":70,"FLAG_UNUSED_0x047":71,"FLAG_UNUSED_0x048":72,"FLAG_UNUSED_0x049":73,"FLAG_UNUSED_0x04A":74,"FLAG_UNUSED_0x04B":75,"FLAG_UNUSED_0x04C":76,"FLAG_UNUSED_0x04D":77,"FLAG_UNUSED_0x04E":78,"FLAG_UNUSED_0x04F":79,"FLAG_UNUSED_0x055":85,"FLAG_UNUSED_0x0E9":233,"FLAG_UNUSED_0x1AA":426,"FLAG_UNUSED_0x1AB":427,"FLAG_UNUSED_0x1DA":474,"FLAG_UNUSED_0x1DE":478,"FLAG_UNUSED_0x1DF":479,"FLAG_UNUSED_0x1E0":480,"FLAG_UNUSED_0x1E1":481,"FLAG_UNUSED_0x264":612,"FLAG_UNUSED_0x265":613,"FLAG_UNUSED_0x266":614,"FLAG_UNUSED_0x267":615,"FLAG_UNUSED_0x268":616,"FLAG_UNUSED_0x269":617,"FLAG_UNUSED_0x26A":618,"FLAG_UNUSED_0x26B":619,"FLAG_UNUSED_0x26C":620,"FLAG_UNUSED_0x26D":621,"FLAG_UNUSED_0x26E":622,"FLAG_UNUSED_0x26F":623,"FLAG_UNUSED_0x270":624,"FLAG_UNUSED_0x271":625,"FLAG_UNUSED_0x272":626,"FLAG_UNUSED_0x273":627,"FLAG_UNUSED_0x274":628,"FLAG_UNUSED_0x275":629,"FLAG_UNUSED_0x276":630,"FLAG_UNUSED_0x277":631,"FLAG_UNUSED_0x278":632,"FLAG_UNUSED_0x279":633,"FLAG_UNUSED_0x27A":634,"FLAG_UNUSED_0x27B":635,"FLAG_UNUSED_0x27C":636,"FLAG_UNUSED_0x27D":637,"FLAG_UNUSED_0x27E":638,"FLAG_UNUSED_0x27F":639,"FLAG_UNUSED_0x280":640,"FLAG_UNUSED_0x281":641,"FLAG_UNUSED_0x282":642,"FLAG_UNUSED_0x283":643,"FLAG_UNUSED_0x284":644,"FLAG_UNUSED_0x285":645,"FLAG_UNUSED_0x286":646,"FLAG_UNUSED_0x287":647,"FLAG_UNUSED_0x288":648,"FLAG_UNUSED_0x289":649,"FLAG_UNUSED_0x28A":650,"FLAG_UNUSED_0x28B":651,"FLAG_UNUSED_0x28C":652,"FLAG_UNUSED_0x28D":653,"FLAG_UNUSED_0x28E":654,"FLAG_UNUSED_0x28F":655,"FLAG_UNUSED_0x290":656,"FLAG_UNUSED_0x291":657,"FLAG_UNUSED_0x292":658,"FLAG_UNUSED_0x293":659,"FLAG_UNUSED_0x294":660,"FLAG_UNUSED_0x295":661,"FLAG_UNUSED_0x296":662,"FLAG_UNUSED_0x297":663,"FLAG_UNUSED_0x298":664,"FLAG_UNUSED_0x299":665,"FLAG_UNUSED_0x29A":666,"FLAG_UNUSED_0x29B":667,"FLAG_UNUSED_0x29C":668,"FLAG_UNUSED_0x29D":669,"FLAG_UNUSED_0x29E":670,"FLAG_UNUSED_0x29F":671,"FLAG_UNUSED_0x2A0":672,"FLAG_UNUSED_0x2A1":673,"FLAG_UNUSED_0x2A2":674,"FLAG_UNUSED_0x2A3":675,"FLAG_UNUSED_0x2A4":676,"FLAG_UNUSED_0x2A5":677,"FLAG_UNUSED_0x2A6":678,"FLAG_UNUSED_0x2A7":679,"FLAG_UNUSED_0x2A8":680,"FLAG_UNUSED_0x2A9":681,"FLAG_UNUSED_0x2AA":682,"FLAG_UNUSED_0x2AB":683,"FLAG_UNUSED_0x2AC":684,"FLAG_UNUSED_0x2AD":685,"FLAG_UNUSED_0x2AE":686,"FLAG_UNUSED_0x2AF":687,"FLAG_UNUSED_0x2B0":688,"FLAG_UNUSED_0x2B1":689,"FLAG_UNUSED_0x2B2":690,"FLAG_UNUSED_0x2B3":691,"FLAG_UNUSED_0x2B4":692,"FLAG_UNUSED_0x2B5":693,"FLAG_UNUSED_0x2B6":694,"FLAG_UNUSED_0x2B7":695,"FLAG_UNUSED_0x2B8":696,"FLAG_UNUSED_0x2B9":697,"FLAG_UNUSED_0x2BA":698,"FLAG_UNUSED_0x2BB":699,"FLAG_UNUSED_0x468":1128,"FLAG_UNUSED_0x470":1136,"FLAG_UNUSED_0x472":1138,"FLAG_UNUSED_0x479":1145,"FLAG_UNUSED_0x4A8":1192,"FLAG_UNUSED_0x4A9":1193,"FLAG_UNUSED_0x4AA":1194,"FLAG_UNUSED_0x4AB":1195,"FLAG_UNUSED_0x4AC":1196,"FLAG_UNUSED_0x4AD":1197,"FLAG_UNUSED_0x4AE":1198,"FLAG_UNUSED_0x4AF":1199,"FLAG_UNUSED_0x4B0":1200,"FLAG_UNUSED_0x4B1":1201,"FLAG_UNUSED_0x4B2":1202,"FLAG_UNUSED_0x4B3":1203,"FLAG_UNUSED_0x4B4":1204,"FLAG_UNUSED_0x4B5":1205,"FLAG_UNUSED_0x4B6":1206,"FLAG_UNUSED_0x4B7":1207,"FLAG_UNUSED_0x4B8":1208,"FLAG_UNUSED_0x4B9":1209,"FLAG_UNUSED_0x4BA":1210,"FLAG_UNUSED_0x4BB":1211,"FLAG_UNUSED_0x4BC":1212,"FLAG_UNUSED_0x4BD":1213,"FLAG_UNUSED_0x4BE":1214,"FLAG_UNUSED_0x4BF":1215,"FLAG_UNUSED_0x4C0":1216,"FLAG_UNUSED_0x4C1":1217,"FLAG_UNUSED_0x4C2":1218,"FLAG_UNUSED_0x4C3":1219,"FLAG_UNUSED_0x4C4":1220,"FLAG_UNUSED_0x4C5":1221,"FLAG_UNUSED_0x4C6":1222,"FLAG_UNUSED_0x4C7":1223,"FLAG_UNUSED_0x4C8":1224,"FLAG_UNUSED_0x4C9":1225,"FLAG_UNUSED_0x4CA":1226,"FLAG_UNUSED_0x4CB":1227,"FLAG_UNUSED_0x4CC":1228,"FLAG_UNUSED_0x4CD":1229,"FLAG_UNUSED_0x4CE":1230,"FLAG_UNUSED_0x4CF":1231,"FLAG_UNUSED_0x4D0":1232,"FLAG_UNUSED_0x4D1":1233,"FLAG_UNUSED_0x4D2":1234,"FLAG_UNUSED_0x4D3":1235,"FLAG_UNUSED_0x4D4":1236,"FLAG_UNUSED_0x4D5":1237,"FLAG_UNUSED_0x4D6":1238,"FLAG_UNUSED_0x4D7":1239,"FLAG_UNUSED_0x4D8":1240,"FLAG_UNUSED_0x4D9":1241,"FLAG_UNUSED_0x4DA":1242,"FLAG_UNUSED_0x4DB":1243,"FLAG_UNUSED_0x4DC":1244,"FLAG_UNUSED_0x4DD":1245,"FLAG_UNUSED_0x4DE":1246,"FLAG_UNUSED_0x4DF":1247,"FLAG_UNUSED_0x4E0":1248,"FLAG_UNUSED_0x4E1":1249,"FLAG_UNUSED_0x4E2":1250,"FLAG_UNUSED_0x4E3":1251,"FLAG_UNUSED_0x4E4":1252,"FLAG_UNUSED_0x4E5":1253,"FLAG_UNUSED_0x4E6":1254,"FLAG_UNUSED_0x4E7":1255,"FLAG_UNUSED_0x4E8":1256,"FLAG_UNUSED_0x4E9":1257,"FLAG_UNUSED_0x4EA":1258,"FLAG_UNUSED_0x4EB":1259,"FLAG_UNUSED_0x4EC":1260,"FLAG_UNUSED_0x4ED":1261,"FLAG_UNUSED_0x4EE":1262,"FLAG_UNUSED_0x4EF":1263,"FLAG_UNUSED_0x4F9":1273,"FLAG_UNUSED_0x4FA":1274,"FLAG_UNUSED_0x4FF":1279,"FLAG_UNUSED_0x863":2147,"FLAG_UNUSED_0x881":2177,"FLAG_UNUSED_0x882":2178,"FLAG_UNUSED_0x883":2179,"FLAG_UNUSED_0x884":2180,"FLAG_UNUSED_0x885":2181,"FLAG_UNUSED_0x886":2182,"FLAG_UNUSED_0x887":2183,"FLAG_UNUSED_0x88E":2190,"FLAG_UNUSED_0x88F":2191,"FLAG_UNUSED_0x8E3":2275,"FLAG_UNUSED_0x8E5":2277,"FLAG_UNUSED_0x8E6":2278,"FLAG_UNUSED_0x8E7":2279,"FLAG_UNUSED_0x8E8":2280,"FLAG_UNUSED_0x8E9":2281,"FLAG_UNUSED_0x8EA":2282,"FLAG_UNUSED_0x8EB":2283,"FLAG_UNUSED_0x8EC":2284,"FLAG_UNUSED_0x8ED":2285,"FLAG_UNUSED_0x8EE":2286,"FLAG_UNUSED_0x8EF":2287,"FLAG_UNUSED_0x8F0":2288,"FLAG_UNUSED_0x8F1":2289,"FLAG_UNUSED_0x8F2":2290,"FLAG_UNUSED_0x8F3":2291,"FLAG_UNUSED_0x8F4":2292,"FLAG_UNUSED_0x8F5":2293,"FLAG_UNUSED_0x8F6":2294,"FLAG_UNUSED_0x8F7":2295,"FLAG_UNUSED_0x8F8":2296,"FLAG_UNUSED_0x8F9":2297,"FLAG_UNUSED_0x8FA":2298,"FLAG_UNUSED_0x8FB":2299,"FLAG_UNUSED_0x8FC":2300,"FLAG_UNUSED_0x8FD":2301,"FLAG_UNUSED_0x8FE":2302,"FLAG_UNUSED_0x8FF":2303,"FLAG_UNUSED_0x900":2304,"FLAG_UNUSED_0x901":2305,"FLAG_UNUSED_0x902":2306,"FLAG_UNUSED_0x903":2307,"FLAG_UNUSED_0x904":2308,"FLAG_UNUSED_0x905":2309,"FLAG_UNUSED_0x906":2310,"FLAG_UNUSED_0x907":2311,"FLAG_UNUSED_0x908":2312,"FLAG_UNUSED_0x909":2313,"FLAG_UNUSED_0x90A":2314,"FLAG_UNUSED_0x90B":2315,"FLAG_UNUSED_0x90C":2316,"FLAG_UNUSED_0x90D":2317,"FLAG_UNUSED_0x90E":2318,"FLAG_UNUSED_0x90F":2319,"FLAG_UNUSED_0x910":2320,"FLAG_UNUSED_0x911":2321,"FLAG_UNUSED_0x912":2322,"FLAG_UNUSED_0x913":2323,"FLAG_UNUSED_0x914":2324,"FLAG_UNUSED_0x915":2325,"FLAG_UNUSED_0x916":2326,"FLAG_UNUSED_0x917":2327,"FLAG_UNUSED_0x918":2328,"FLAG_UNUSED_0x919":2329,"FLAG_UNUSED_0x91A":2330,"FLAG_UNUSED_0x91B":2331,"FLAG_UNUSED_0x91C":2332,"FLAG_UNUSED_0x91D":2333,"FLAG_UNUSED_0x91E":2334,"FLAG_UNUSED_0x91F":2335,"FLAG_UNUSED_0x920":2336,"FLAG_UNUSED_0x923":2339,"FLAG_UNUSED_0x924":2340,"FLAG_UNUSED_0x925":2341,"FLAG_UNUSED_0x926":2342,"FLAG_UNUSED_0x927":2343,"FLAG_UNUSED_0x928":2344,"FLAG_UNUSED_0x929":2345,"FLAG_UNUSED_0x933":2355,"FLAG_UNUSED_0x935":2357,"FLAG_UNUSED_0x936":2358,"FLAG_UNUSED_0x937":2359,"FLAG_UNUSED_0x938":2360,"FLAG_UNUSED_0x939":2361,"FLAG_UNUSED_0x93A":2362,"FLAG_UNUSED_0x93B":2363,"FLAG_UNUSED_0x93C":2364,"FLAG_UNUSED_0x93D":2365,"FLAG_UNUSED_0x93E":2366,"FLAG_UNUSED_0x93F":2367,"FLAG_UNUSED_0x940":2368,"FLAG_UNUSED_0x941":2369,"FLAG_UNUSED_0x942":2370,"FLAG_UNUSED_0x943":2371,"FLAG_UNUSED_0x944":2372,"FLAG_UNUSED_0x945":2373,"FLAG_UNUSED_0x946":2374,"FLAG_UNUSED_0x947":2375,"FLAG_UNUSED_0x948":2376,"FLAG_UNUSED_0x949":2377,"FLAG_UNUSED_0x94A":2378,"FLAG_UNUSED_0x94B":2379,"FLAG_UNUSED_0x94C":2380,"FLAG_UNUSED_0x94D":2381,"FLAG_UNUSED_0x94E":2382,"FLAG_UNUSED_0x94F":2383,"FLAG_UNUSED_0x950":2384,"FLAG_UNUSED_0x951":2385,"FLAG_UNUSED_0x952":2386,"FLAG_UNUSED_0x953":2387,"FLAG_UNUSED_0x954":2388,"FLAG_UNUSED_0x955":2389,"FLAG_UNUSED_0x956":2390,"FLAG_UNUSED_0x957":2391,"FLAG_UNUSED_0x958":2392,"FLAG_UNUSED_0x959":2393,"FLAG_UNUSED_0x95A":2394,"FLAG_UNUSED_0x95B":2395,"FLAG_UNUSED_0x95C":2396,"FLAG_UNUSED_0x95D":2397,"FLAG_UNUSED_0x95E":2398,"FLAG_UNUSED_0x95F":2399,"FLAG_UNUSED_RS_LEGENDARY_BATTLE_DONE":113,"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,"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_HM01_CUT":339,"ITEM_HM02":340,"ITEM_HM02_FLY":340,"ITEM_HM03":341,"ITEM_HM03_SURF":341,"ITEM_HM04":342,"ITEM_HM04_STRENGTH":342,"ITEM_HM05":343,"ITEM_HM05_FLASH":343,"ITEM_HM06":344,"ITEM_HM06_ROCK_SMASH":344,"ITEM_HM07":345,"ITEM_HM07_WATERFALL":345,"ITEM_HM08":346,"ITEM_HM08_DIVE":346,"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_TM01_FOCUS_PUNCH":289,"ITEM_TM02":290,"ITEM_TM02_DRAGON_CLAW":290,"ITEM_TM03":291,"ITEM_TM03_WATER_PULSE":291,"ITEM_TM04":292,"ITEM_TM04_CALM_MIND":292,"ITEM_TM05":293,"ITEM_TM05_ROAR":293,"ITEM_TM06":294,"ITEM_TM06_TOXIC":294,"ITEM_TM07":295,"ITEM_TM07_HAIL":295,"ITEM_TM08":296,"ITEM_TM08_BULK_UP":296,"ITEM_TM09":297,"ITEM_TM09_BULLET_SEED":297,"ITEM_TM10":298,"ITEM_TM10_HIDDEN_POWER":298,"ITEM_TM11":299,"ITEM_TM11_SUNNY_DAY":299,"ITEM_TM12":300,"ITEM_TM12_TAUNT":300,"ITEM_TM13":301,"ITEM_TM13_ICE_BEAM":301,"ITEM_TM14":302,"ITEM_TM14_BLIZZARD":302,"ITEM_TM15":303,"ITEM_TM15_HYPER_BEAM":303,"ITEM_TM16":304,"ITEM_TM16_LIGHT_SCREEN":304,"ITEM_TM17":305,"ITEM_TM17_PROTECT":305,"ITEM_TM18":306,"ITEM_TM18_RAIN_DANCE":306,"ITEM_TM19":307,"ITEM_TM19_GIGA_DRAIN":307,"ITEM_TM20":308,"ITEM_TM20_SAFEGUARD":308,"ITEM_TM21":309,"ITEM_TM21_FRUSTRATION":309,"ITEM_TM22":310,"ITEM_TM22_SOLAR_BEAM":310,"ITEM_TM23":311,"ITEM_TM23_IRON_TAIL":311,"ITEM_TM24":312,"ITEM_TM24_THUNDERBOLT":312,"ITEM_TM25":313,"ITEM_TM25_THUNDER":313,"ITEM_TM26":314,"ITEM_TM26_EARTHQUAKE":314,"ITEM_TM27":315,"ITEM_TM27_RETURN":315,"ITEM_TM28":316,"ITEM_TM28_DIG":316,"ITEM_TM29":317,"ITEM_TM29_PSYCHIC":317,"ITEM_TM30":318,"ITEM_TM30_SHADOW_BALL":318,"ITEM_TM31":319,"ITEM_TM31_BRICK_BREAK":319,"ITEM_TM32":320,"ITEM_TM32_DOUBLE_TEAM":320,"ITEM_TM33":321,"ITEM_TM33_REFLECT":321,"ITEM_TM34":322,"ITEM_TM34_SHOCK_WAVE":322,"ITEM_TM35":323,"ITEM_TM35_FLAMETHROWER":323,"ITEM_TM36":324,"ITEM_TM36_SLUDGE_BOMB":324,"ITEM_TM37":325,"ITEM_TM37_SANDSTORM":325,"ITEM_TM38":326,"ITEM_TM38_FIRE_BLAST":326,"ITEM_TM39":327,"ITEM_TM39_ROCK_TOMB":327,"ITEM_TM40":328,"ITEM_TM40_AERIAL_ACE":328,"ITEM_TM41":329,"ITEM_TM41_TORMENT":329,"ITEM_TM42":330,"ITEM_TM42_FACADE":330,"ITEM_TM43":331,"ITEM_TM43_SECRET_POWER":331,"ITEM_TM44":332,"ITEM_TM44_REST":332,"ITEM_TM45":333,"ITEM_TM45_ATTRACT":333,"ITEM_TM46":334,"ITEM_TM46_THIEF":334,"ITEM_TM47":335,"ITEM_TM47_STEEL_WING":335,"ITEM_TM48":336,"ITEM_TM48_SKILL_SWAP":336,"ITEM_TM49":337,"ITEM_TM49_SNATCH":337,"ITEM_TM50":338,"ITEM_TM50_OVERHEAT":338,"ITEM_TM_CASE":364,"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,"NUM_BADGES":8,"NUM_BERRY_MASTER_BERRIES":10,"NUM_BERRY_MASTER_BERRIES_SKIPPED":20,"NUM_BERRY_MASTER_WIFE_BERRIES":10,"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_SPECIES":412,"NUM_TECHNICAL_MACHINES":50,"NUM_WONDER_CARD_FLAGS":20,"OLD_ROD":0,"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},"locations":{"BADGE_1":{"default_item":226,"flag":1182,"rom_address":2181887},"BADGE_2":{"default_item":227,"flag":1183,"rom_address":2089138},"BADGE_3":{"default_item":228,"flag":1184,"rom_address":2161147},"BADGE_4":{"default_item":229,"flag":1185,"rom_address":2097239},"BADGE_5":{"default_item":230,"flag":1186,"rom_address":2123748},"BADGE_6":{"default_item":231,"flag":1187,"rom_address":2195957},"BADGE_7":{"default_item":232,"flag":1188,"rom_address":2237755},"BADGE_8":{"default_item":233,"flag":1189,"rom_address":2256065},"HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":{"default_item":281,"flag":531,"rom_address":5479240},"HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":{"default_item":282,"flag":532,"rom_address":5479252},"HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":{"default_item":283,"flag":533,"rom_address":5479264},"HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":{"default_item":284,"flag":534,"rom_address":5479276},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":{"default_item":67,"flag":601,"rom_address":5482140},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":{"default_item":65,"flag":604,"rom_address":5482164},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":{"default_item":64,"flag":603,"rom_address":5482152},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":{"default_item":70,"flag":602,"rom_address":5482128},"HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":{"default_item":110,"flag":528,"rom_address":5417964},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":{"default_item":195,"flag":548,"rom_address":5469412},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":{"default_item":195,"flag":549,"rom_address":5469424},"HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":{"default_item":23,"flag":577,"rom_address":5471156},"HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":{"default_item":3,"flag":576,"rom_address":5471168},"HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":{"default_item":16,"flag":500,"rom_address":5417712},"HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":{"default_item":111,"flag":527,"rom_address":5414672},"HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":{"default_item":4,"flag":575,"rom_address":5414696},"HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":{"default_item":69,"flag":543,"rom_address":5414684},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":{"default_item":35,"flag":578,"rom_address":5472480},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":{"default_item":2,"flag":529,"rom_address":5472468},"HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":{"default_item":68,"flag":580,"rom_address":5472836},"HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":{"default_item":70,"flag":579,"rom_address":5472824},"HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":{"default_item":45,"flag":609,"rom_address":5507844},"HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":{"default_item":68,"flag":595,"rom_address":5411036},"HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":{"default_item":4,"flag":561,"rom_address":5469948},"HIDDEN_ITEM_PETALBURG_WOODS_POTION":{"default_item":13,"flag":558,"rom_address":5469912},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":{"default_item":103,"flag":559,"rom_address":5469924},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":{"default_item":103,"flag":560,"rom_address":5469936},"HIDDEN_ITEM_ROUTE_104_ANTIDOTE":{"default_item":14,"flag":585,"rom_address":5420532},"HIDDEN_ITEM_ROUTE_104_HEART_SCALE":{"default_item":111,"flag":588,"rom_address":5420544},"HIDDEN_ITEM_ROUTE_104_POKE_BALL":{"default_item":4,"flag":562,"rom_address":5420508},"HIDDEN_ITEM_ROUTE_104_POTION":{"default_item":13,"flag":537,"rom_address":5420520},"HIDDEN_ITEM_ROUTE_104_SUPER_POTION":{"default_item":22,"flag":544,"rom_address":5420496},"HIDDEN_ITEM_ROUTE_105_BIG_PEARL":{"default_item":107,"flag":611,"rom_address":5420788},"HIDDEN_ITEM_ROUTE_105_HEART_SCALE":{"default_item":111,"flag":589,"rom_address":5420776},"HIDDEN_ITEM_ROUTE_106_HEART_SCALE":{"default_item":111,"flag":547,"rom_address":5420972},"HIDDEN_ITEM_ROUTE_106_POKE_BALL":{"default_item":4,"flag":563,"rom_address":5420948},"HIDDEN_ITEM_ROUTE_106_STARDUST":{"default_item":108,"flag":546,"rom_address":5420960},"HIDDEN_ITEM_ROUTE_108_RARE_CANDY":{"default_item":68,"flag":586,"rom_address":5421380},"HIDDEN_ITEM_ROUTE_109_ETHER":{"default_item":34,"flag":564,"rom_address":5422056},"HIDDEN_ITEM_ROUTE_109_GREAT_BALL":{"default_item":3,"flag":551,"rom_address":5422044},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":{"default_item":111,"flag":552,"rom_address":5422032},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":{"default_item":111,"flag":590,"rom_address":5422068},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":{"default_item":111,"flag":591,"rom_address":5422080},"HIDDEN_ITEM_ROUTE_109_REVIVE":{"default_item":24,"flag":550,"rom_address":5422020},"HIDDEN_ITEM_ROUTE_110_FULL_HEAL":{"default_item":23,"flag":555,"rom_address":5423348},"HIDDEN_ITEM_ROUTE_110_GREAT_BALL":{"default_item":3,"flag":553,"rom_address":5423324},"HIDDEN_ITEM_ROUTE_110_POKE_BALL":{"default_item":4,"flag":565,"rom_address":5423336},"HIDDEN_ITEM_ROUTE_110_REVIVE":{"default_item":24,"flag":554,"rom_address":5423312},"HIDDEN_ITEM_ROUTE_111_PROTEIN":{"default_item":64,"flag":556,"rom_address":5425260},"HIDDEN_ITEM_ROUTE_111_RARE_CANDY":{"default_item":68,"flag":557,"rom_address":5425272},"HIDDEN_ITEM_ROUTE_111_STARDUST":{"default_item":108,"flag":502,"rom_address":5425200},"HIDDEN_ITEM_ROUTE_113_ETHER":{"default_item":34,"flag":503,"rom_address":5426528},"HIDDEN_ITEM_ROUTE_113_NUGGET":{"default_item":110,"flag":598,"rom_address":5426552},"HIDDEN_ITEM_ROUTE_113_TM32":{"default_item":320,"flag":530,"rom_address":5426540},"HIDDEN_ITEM_ROUTE_114_CARBOS":{"default_item":66,"flag":504,"rom_address":5427380},"HIDDEN_ITEM_ROUTE_114_REVIVE":{"default_item":24,"flag":542,"rom_address":5427404},"HIDDEN_ITEM_ROUTE_115_HEART_SCALE":{"default_item":111,"flag":597,"rom_address":5428216},"HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":{"default_item":206,"flag":596,"rom_address":5429096},"HIDDEN_ITEM_ROUTE_116_SUPER_POTION":{"default_item":22,"flag":545,"rom_address":5429084},"HIDDEN_ITEM_ROUTE_117_REPEL":{"default_item":86,"flag":572,"rom_address":5429748},"HIDDEN_ITEM_ROUTE_118_HEART_SCALE":{"default_item":111,"flag":566,"rom_address":5430444},"HIDDEN_ITEM_ROUTE_118_IRON":{"default_item":65,"flag":567,"rom_address":5430432},"HIDDEN_ITEM_ROUTE_119_CALCIUM":{"default_item":67,"flag":505,"rom_address":5432012},"HIDDEN_ITEM_ROUTE_119_FULL_HEAL":{"default_item":23,"flag":568,"rom_address":5432096},"HIDDEN_ITEM_ROUTE_119_MAX_ETHER":{"default_item":35,"flag":587,"rom_address":5432108},"HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":{"default_item":2,"flag":506,"rom_address":5432024},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":{"default_item":68,"flag":571,"rom_address":5433636},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":{"default_item":68,"flag":569,"rom_address":5433660},"HIDDEN_ITEM_ROUTE_120_REVIVE":{"default_item":24,"flag":584,"rom_address":5433648},"HIDDEN_ITEM_ROUTE_120_ZINC":{"default_item":70,"flag":570,"rom_address":5433672},"HIDDEN_ITEM_ROUTE_121_FULL_HEAL":{"default_item":23,"flag":573,"rom_address":5434580},"HIDDEN_ITEM_ROUTE_121_HP_UP":{"default_item":63,"flag":539,"rom_address":5434556},"HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":{"default_item":25,"flag":600,"rom_address":5434592},"HIDDEN_ITEM_ROUTE_121_NUGGET":{"default_item":110,"flag":540,"rom_address":5434568},"HIDDEN_ITEM_ROUTE_123_HYPER_POTION":{"default_item":21,"flag":574,"rom_address":5436140},"HIDDEN_ITEM_ROUTE_123_PP_UP":{"default_item":69,"flag":599,"rom_address":5436152},"HIDDEN_ITEM_ROUTE_123_RARE_CANDY":{"default_item":68,"flag":610,"rom_address":5436164},"HIDDEN_ITEM_ROUTE_123_REVIVE":{"default_item":24,"flag":541,"rom_address":5436128},"HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":{"default_item":83,"flag":507,"rom_address":5436092},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":{"default_item":111,"flag":592,"rom_address":5437660},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":{"default_item":111,"flag":593,"rom_address":5437672},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":{"default_item":111,"flag":594,"rom_address":5437684},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":{"default_item":68,"flag":606,"rom_address":5499296},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":{"default_item":70,"flag":607,"rom_address":5499308},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":{"default_item":19,"flag":605,"rom_address":5499472},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":{"default_item":69,"flag":608,"rom_address":5499460},"HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":{"default_item":200,"flag":535,"rom_address":5493332},"HIDDEN_ITEM_TRICK_HOUSE_NUGGET":{"default_item":110,"flag":501,"rom_address":5508756},"HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":{"default_item":107,"flag":511,"rom_address":5439032},"HIDDEN_ITEM_UNDERWATER_124_CALCIUM":{"default_item":67,"flag":536,"rom_address":5439056},"HIDDEN_ITEM_UNDERWATER_124_CARBOS":{"default_item":66,"flag":508,"rom_address":5438996},"HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":{"default_item":51,"flag":509,"rom_address":5439008},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":{"default_item":111,"flag":513,"rom_address":5439044},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":{"default_item":111,"flag":538,"rom_address":5439068},"HIDDEN_ITEM_UNDERWATER_124_PEARL":{"default_item":106,"flag":510,"rom_address":5439020},"HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":{"default_item":107,"flag":520,"rom_address":5439180},"HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":{"default_item":49,"flag":512,"rom_address":5439192},"HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":{"default_item":111,"flag":514,"rom_address":5439108},"HIDDEN_ITEM_UNDERWATER_126_IRON":{"default_item":65,"flag":519,"rom_address":5439156},"HIDDEN_ITEM_UNDERWATER_126_PEARL":{"default_item":106,"flag":517,"rom_address":5439144},"HIDDEN_ITEM_UNDERWATER_126_STARDUST":{"default_item":108,"flag":516,"rom_address":5439132},"HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":{"default_item":2,"flag":515,"rom_address":5439120},"HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":{"default_item":50,"flag":518,"rom_address":5439168},"HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":{"default_item":111,"flag":523,"rom_address":5439264},"HIDDEN_ITEM_UNDERWATER_127_HP_UP":{"default_item":63,"flag":522,"rom_address":5439252},"HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":{"default_item":48,"flag":524,"rom_address":5439276},"HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":{"default_item":109,"flag":521,"rom_address":5439240},"HIDDEN_ITEM_UNDERWATER_128_PEARL":{"default_item":106,"flag":526,"rom_address":5439328},"HIDDEN_ITEM_UNDERWATER_128_PROTEIN":{"default_item":64,"flag":525,"rom_address":5439316},"HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":{"default_item":2,"flag":581,"rom_address":5475972},"HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":{"default_item":36,"flag":582,"rom_address":5476784},"HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":{"default_item":84,"flag":583,"rom_address":5476796},"ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":{"default_item":285,"flag":1100,"rom_address":2701736},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM18":{"default_item":306,"flag":1102,"rom_address":2701788},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":{"default_item":97,"flag":1101,"rom_address":2701775},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_4_SCANNER":{"default_item":278,"flag":1078,"rom_address":2701762},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":{"default_item":11,"flag":1077,"rom_address":2701749},"ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":{"default_item":122,"flag":1095,"rom_address":2701671},"ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":{"default_item":24,"flag":1099,"rom_address":2701723},"ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":{"default_item":7,"flag":1097,"rom_address":2701697},"ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":{"default_item":85,"flag":1096,"rom_address":2701684},"ITEM_ABANDONED_SHIP_ROOMS_B1F_TM13":{"default_item":301,"flag":1098,"rom_address":2701710},"ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":{"default_item":1,"flag":1124,"rom_address":2701970},"ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":{"default_item":37,"flag":1071,"rom_address":2701996},"ITEM_AQUA_HIDEOUT_B1F_NUGGET":{"default_item":110,"flag":1132,"rom_address":2701983},"ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":{"default_item":8,"flag":1072,"rom_address":2702009},"ITEM_ARTISAN_CAVE_1F_CARBOS":{"default_item":66,"flag":1163,"rom_address":2702347},"ITEM_ARTISAN_CAVE_B1F_HP_UP":{"default_item":63,"flag":1162,"rom_address":2702334},"ITEM_FIERY_PATH_FIRE_STONE":{"default_item":95,"flag":1111,"rom_address":2701515},"ITEM_FIERY_PATH_TM06":{"default_item":294,"flag":1091,"rom_address":2701528},"ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":{"default_item":85,"flag":1050,"rom_address":2701450},"ITEM_GRANITE_CAVE_B1F_POKE_BALL":{"default_item":4,"flag":1051,"rom_address":2701463},"ITEM_GRANITE_CAVE_B2F_RARE_CANDY":{"default_item":68,"flag":1054,"rom_address":2701489},"ITEM_GRANITE_CAVE_B2F_REPEL":{"default_item":86,"flag":1053,"rom_address":2701476},"ITEM_JAGGED_PASS_BURN_HEAL":{"default_item":15,"flag":1070,"rom_address":2701502},"ITEM_LILYCOVE_CITY_MAX_REPEL":{"default_item":84,"flag":1042,"rom_address":2701346},"ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":{"default_item":68,"flag":1151,"rom_address":2702360},"ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":{"default_item":19,"flag":1165,"rom_address":2702386},"ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":{"default_item":37,"flag":1164,"rom_address":2702373},"ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":{"default_item":110,"flag":1166,"rom_address":2702399},"ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":{"default_item":71,"flag":1167,"rom_address":2702412},"ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":{"default_item":85,"flag":1059,"rom_address":2702438},"ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":{"default_item":25,"flag":1168,"rom_address":2702425},"ITEM_MAUVILLE_CITY_X_SPEED":{"default_item":77,"flag":1116,"rom_address":2701320},"ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":{"default_item":23,"flag":1045,"rom_address":2701554},"ITEM_METEOR_FALLS_1F_1R_MOON_STONE":{"default_item":94,"flag":1046,"rom_address":2701567},"ITEM_METEOR_FALLS_1F_1R_PP_UP":{"default_item":69,"flag":1047,"rom_address":2701580},"ITEM_METEOR_FALLS_1F_1R_TM23":{"default_item":311,"flag":1044,"rom_address":2701541},"ITEM_METEOR_FALLS_B1F_2R_TM02":{"default_item":290,"flag":1080,"rom_address":2701593},"ITEM_MOSSDEEP_CITY_NET_BALL":{"default_item":6,"flag":1043,"rom_address":2701359},"ITEM_MT_PYRE_2F_ULTRA_BALL":{"default_item":2,"flag":1129,"rom_address":2701879},"ITEM_MT_PYRE_3F_SUPER_REPEL":{"default_item":83,"flag":1120,"rom_address":2701892},"ITEM_MT_PYRE_4F_SEA_INCENSE":{"default_item":220,"flag":1130,"rom_address":2701905},"ITEM_MT_PYRE_5F_LAX_INCENSE":{"default_item":221,"flag":1052,"rom_address":2701918},"ITEM_MT_PYRE_6F_TM30":{"default_item":318,"flag":1089,"rom_address":2701931},"ITEM_MT_PYRE_EXTERIOR_MAX_POTION":{"default_item":20,"flag":1073,"rom_address":2701944},"ITEM_MT_PYRE_EXTERIOR_TM48":{"default_item":336,"flag":1074,"rom_address":2701957},"ITEM_NEW_MAUVILLE_ESCAPE_ROPE":{"default_item":85,"flag":1076,"rom_address":2701619},"ITEM_NEW_MAUVILLE_FULL_HEAL":{"default_item":23,"flag":1122,"rom_address":2701645},"ITEM_NEW_MAUVILLE_PARALYZE_HEAL":{"default_item":18,"flag":1123,"rom_address":2701658},"ITEM_NEW_MAUVILLE_THUNDER_STONE":{"default_item":96,"flag":1110,"rom_address":2701632},"ITEM_NEW_MAUVILLE_ULTRA_BALL":{"default_item":2,"flag":1075,"rom_address":2701606},"ITEM_PETALBURG_CITY_ETHER":{"default_item":34,"flag":1040,"rom_address":2701307},"ITEM_PETALBURG_CITY_MAX_REVIVE":{"default_item":25,"flag":1039,"rom_address":2701294},"ITEM_PETALBURG_WOODS_ETHER":{"default_item":34,"flag":1058,"rom_address":2701398},"ITEM_PETALBURG_WOODS_GREAT_BALL":{"default_item":3,"flag":1056,"rom_address":2701385},"ITEM_PETALBURG_WOODS_PARALYZE_HEAL":{"default_item":18,"flag":1117,"rom_address":2701411},"ITEM_PETALBURG_WOODS_X_ATTACK":{"default_item":75,"flag":1055,"rom_address":2701372},"ITEM_ROUTE_102_POTION":{"default_item":13,"flag":1000,"rom_address":2700306},"ITEM_ROUTE_103_GUARD_SPEC":{"default_item":73,"flag":1114,"rom_address":2700319},"ITEM_ROUTE_103_PP_UP":{"default_item":69,"flag":1137,"rom_address":2700332},"ITEM_ROUTE_104_POKE_BALL":{"default_item":4,"flag":1057,"rom_address":2700358},"ITEM_ROUTE_104_POTION":{"default_item":13,"flag":1135,"rom_address":2700384},"ITEM_ROUTE_104_PP_UP":{"default_item":69,"flag":1002,"rom_address":2700345},"ITEM_ROUTE_104_X_ACCURACY":{"default_item":78,"flag":1115,"rom_address":2700371},"ITEM_ROUTE_105_IRON":{"default_item":65,"flag":1003,"rom_address":2700397},"ITEM_ROUTE_106_PROTEIN":{"default_item":64,"flag":1004,"rom_address":2700410},"ITEM_ROUTE_108_STAR_PIECE":{"default_item":109,"flag":1139,"rom_address":2700423},"ITEM_ROUTE_109_POTION":{"default_item":13,"flag":1140,"rom_address":2700449},"ITEM_ROUTE_109_PP_UP":{"default_item":69,"flag":1005,"rom_address":2700436},"ITEM_ROUTE_110_DIRE_HIT":{"default_item":74,"flag":1007,"rom_address":2700475},"ITEM_ROUTE_110_ELIXIR":{"default_item":36,"flag":1141,"rom_address":2700488},"ITEM_ROUTE_110_RARE_CANDY":{"default_item":68,"flag":1006,"rom_address":2700462},"ITEM_ROUTE_111_ELIXIR":{"default_item":36,"flag":1142,"rom_address":2700540},"ITEM_ROUTE_111_HP_UP":{"default_item":63,"flag":1010,"rom_address":2700527},"ITEM_ROUTE_111_STARDUST":{"default_item":108,"flag":1009,"rom_address":2700514},"ITEM_ROUTE_111_TM37":{"default_item":325,"flag":1008,"rom_address":2700501},"ITEM_ROUTE_112_NUGGET":{"default_item":110,"flag":1011,"rom_address":2700553},"ITEM_ROUTE_113_HYPER_POTION":{"default_item":21,"flag":1143,"rom_address":2700592},"ITEM_ROUTE_113_MAX_ETHER":{"default_item":35,"flag":1012,"rom_address":2700566},"ITEM_ROUTE_113_SUPER_REPEL":{"default_item":83,"flag":1013,"rom_address":2700579},"ITEM_ROUTE_114_ENERGY_POWDER":{"default_item":30,"flag":1160,"rom_address":2700631},"ITEM_ROUTE_114_PROTEIN":{"default_item":64,"flag":1015,"rom_address":2700618},"ITEM_ROUTE_114_RARE_CANDY":{"default_item":68,"flag":1014,"rom_address":2700605},"ITEM_ROUTE_115_GREAT_BALL":{"default_item":3,"flag":1118,"rom_address":2700683},"ITEM_ROUTE_115_HEAL_POWDER":{"default_item":32,"flag":1144,"rom_address":2700696},"ITEM_ROUTE_115_IRON":{"default_item":65,"flag":1018,"rom_address":2700670},"ITEM_ROUTE_115_PP_UP":{"default_item":69,"flag":1161,"rom_address":2700709},"ITEM_ROUTE_115_SUPER_POTION":{"default_item":22,"flag":1016,"rom_address":2700644},"ITEM_ROUTE_115_TM01":{"default_item":289,"flag":1017,"rom_address":2700657},"ITEM_ROUTE_116_ETHER":{"default_item":34,"flag":1019,"rom_address":2700735},"ITEM_ROUTE_116_HP_UP":{"default_item":63,"flag":1021,"rom_address":2700761},"ITEM_ROUTE_116_POTION":{"default_item":13,"flag":1146,"rom_address":2700774},"ITEM_ROUTE_116_REPEL":{"default_item":86,"flag":1020,"rom_address":2700748},"ITEM_ROUTE_116_X_SPECIAL":{"default_item":79,"flag":1001,"rom_address":2700722},"ITEM_ROUTE_117_GREAT_BALL":{"default_item":3,"flag":1022,"rom_address":2700787},"ITEM_ROUTE_117_REVIVE":{"default_item":24,"flag":1023,"rom_address":2700800},"ITEM_ROUTE_118_HYPER_POTION":{"default_item":21,"flag":1121,"rom_address":2700813},"ITEM_ROUTE_119_ELIXIR_1":{"default_item":36,"flag":1026,"rom_address":2700852},"ITEM_ROUTE_119_ELIXIR_2":{"default_item":36,"flag":1147,"rom_address":2700917},"ITEM_ROUTE_119_HYPER_POTION_1":{"default_item":21,"flag":1029,"rom_address":2700891},"ITEM_ROUTE_119_HYPER_POTION_2":{"default_item":21,"flag":1106,"rom_address":2700904},"ITEM_ROUTE_119_LEAF_STONE":{"default_item":98,"flag":1027,"rom_address":2700865},"ITEM_ROUTE_119_NUGGET":{"default_item":110,"flag":1134,"rom_address":2702035},"ITEM_ROUTE_119_RARE_CANDY":{"default_item":68,"flag":1028,"rom_address":2700878},"ITEM_ROUTE_119_SUPER_REPEL":{"default_item":83,"flag":1024,"rom_address":2700826},"ITEM_ROUTE_119_ZINC":{"default_item":70,"flag":1025,"rom_address":2700839},"ITEM_ROUTE_120_FULL_HEAL":{"default_item":23,"flag":1031,"rom_address":2700943},"ITEM_ROUTE_120_HYPER_POTION":{"default_item":21,"flag":1107,"rom_address":2700956},"ITEM_ROUTE_120_NEST_BALL":{"default_item":8,"flag":1108,"rom_address":2700969},"ITEM_ROUTE_120_NUGGET":{"default_item":110,"flag":1030,"rom_address":2700930},"ITEM_ROUTE_120_REVIVE":{"default_item":24,"flag":1148,"rom_address":2700982},"ITEM_ROUTE_121_CARBOS":{"default_item":66,"flag":1103,"rom_address":2700995},"ITEM_ROUTE_121_REVIVE":{"default_item":24,"flag":1149,"rom_address":2701008},"ITEM_ROUTE_121_ZINC":{"default_item":70,"flag":1150,"rom_address":2701021},"ITEM_ROUTE_123_CALCIUM":{"default_item":67,"flag":1032,"rom_address":2701034},"ITEM_ROUTE_123_ELIXIR":{"default_item":36,"flag":1109,"rom_address":2701060},"ITEM_ROUTE_123_PP_UP":{"default_item":69,"flag":1152,"rom_address":2701073},"ITEM_ROUTE_123_REVIVAL_HERB":{"default_item":33,"flag":1153,"rom_address":2701086},"ITEM_ROUTE_123_ULTRA_BALL":{"default_item":2,"flag":1104,"rom_address":2701047},"ITEM_ROUTE_124_BLUE_SHARD":{"default_item":49,"flag":1093,"rom_address":2701112},"ITEM_ROUTE_124_RED_SHARD":{"default_item":48,"flag":1092,"rom_address":2701099},"ITEM_ROUTE_124_YELLOW_SHARD":{"default_item":50,"flag":1066,"rom_address":2701125},"ITEM_ROUTE_125_BIG_PEARL":{"default_item":107,"flag":1154,"rom_address":2701138},"ITEM_ROUTE_126_GREEN_SHARD":{"default_item":51,"flag":1105,"rom_address":2701151},"ITEM_ROUTE_127_CARBOS":{"default_item":66,"flag":1035,"rom_address":2701177},"ITEM_ROUTE_127_RARE_CANDY":{"default_item":68,"flag":1155,"rom_address":2701190},"ITEM_ROUTE_127_ZINC":{"default_item":70,"flag":1034,"rom_address":2701164},"ITEM_ROUTE_132_PROTEIN":{"default_item":64,"flag":1156,"rom_address":2701216},"ITEM_ROUTE_132_RARE_CANDY":{"default_item":68,"flag":1036,"rom_address":2701203},"ITEM_ROUTE_133_BIG_PEARL":{"default_item":107,"flag":1037,"rom_address":2701229},"ITEM_ROUTE_133_MAX_REVIVE":{"default_item":25,"flag":1157,"rom_address":2701255},"ITEM_ROUTE_133_STAR_PIECE":{"default_item":109,"flag":1038,"rom_address":2701242},"ITEM_ROUTE_134_CARBOS":{"default_item":66,"flag":1158,"rom_address":2701268},"ITEM_ROUTE_134_STAR_PIECE":{"default_item":109,"flag":1159,"rom_address":2701281},"ITEM_RUSTBORO_CITY_X_DEFEND":{"default_item":76,"flag":1041,"rom_address":2701333},"ITEM_RUSTURF_TUNNEL_MAX_ETHER":{"default_item":35,"flag":1049,"rom_address":2701437},"ITEM_RUSTURF_TUNNEL_POKE_BALL":{"default_item":4,"flag":1048,"rom_address":2701424},"ITEM_SAFARI_ZONE_NORTH_CALCIUM":{"default_item":67,"flag":1119,"rom_address":2701827},"ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":{"default_item":110,"flag":1169,"rom_address":2701853},"ITEM_SAFARI_ZONE_NORTH_WEST_TM22":{"default_item":310,"flag":1094,"rom_address":2701814},"ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":{"default_item":107,"flag":1170,"rom_address":2701866},"ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":{"default_item":25,"flag":1131,"rom_address":2701840},"ITEM_SCORCHED_SLAB_TM11":{"default_item":299,"flag":1079,"rom_address":2701801},"ITEM_SEAFLOOR_CAVERN_ROOM_9_TM26":{"default_item":314,"flag":1090,"rom_address":2702139},"ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":{"default_item":107,"flag":1081,"rom_address":2702074},"ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":{"default_item":212,"flag":1113,"rom_address":2702126},"ITEM_SHOAL_CAVE_ICE_ROOM_TM07":{"default_item":295,"flag":1112,"rom_address":2702113},"ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":{"default_item":68,"flag":1082,"rom_address":2702087},"ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":{"default_item":16,"flag":1083,"rom_address":2702100},"ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":{"default_item":121,"flag":1060,"rom_address":2702152},"ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":{"default_item":122,"flag":1061,"rom_address":2702165},"ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":{"default_item":126,"flag":1062,"rom_address":2702178},"ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":{"default_item":128,"flag":1063,"rom_address":2702191},"ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":{"default_item":125,"flag":1064,"rom_address":2702204},"ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":{"default_item":124,"flag":1065,"rom_address":2702217},"ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":{"default_item":123,"flag":1067,"rom_address":2702230},"ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":{"default_item":129,"flag":1068,"rom_address":2702243},"ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":{"default_item":127,"flag":1069,"rom_address":2702256},"ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":{"default_item":37,"flag":1084,"rom_address":2702269},"ITEM_VICTORY_ROAD_1F_PP_UP":{"default_item":69,"flag":1085,"rom_address":2702282},"ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":{"default_item":19,"flag":1087,"rom_address":2702308},"ITEM_VICTORY_ROAD_B1F_TM29":{"default_item":317,"flag":1086,"rom_address":2702295},"ITEM_VICTORY_ROAD_B2F_FULL_HEAL":{"default_item":23,"flag":1088,"rom_address":2702321},"NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON":{"default_item":271,"flag":208,"rom_address":1967134},"NPC_GIFT_GOT_TM24_FROM_WATTSON":{"default_item":312,"flag":209,"rom_address":1967168},"NPC_GIFT_RECEIVED_6_SODA_POP":{"default_item":27,"flag":140,"rom_address":2537096},"NPC_GIFT_RECEIVED_ACRO_BIKE":{"default_item":272,"flag":1181,"rom_address":2164456},"NPC_GIFT_RECEIVED_AMULET_COIN":{"default_item":189,"flag":133,"rom_address":2708208},"NPC_GIFT_RECEIVED_CHARCOAL":{"default_item":215,"flag":254,"rom_address":2096554},"NPC_GIFT_RECEIVED_CHESTO_BERRY_ROUTE_104":{"default_item":134,"flag":246,"rom_address":2022873},"NPC_GIFT_RECEIVED_CLEANSE_TAG":{"default_item":190,"flag":282,"rom_address":2305748},"NPC_GIFT_RECEIVED_COIN_CASE":{"default_item":260,"flag":258,"rom_address":2172913},"NPC_GIFT_RECEIVED_DEEP_SEA_SCALE":{"default_item":193,"flag":1190,"rom_address":2156474},"NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH":{"default_item":192,"flag":1191,"rom_address":2156462},"NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":{"default_item":269,"flag":1172,"rom_address":2289508},"NPC_GIFT_RECEIVED_DEVON_SCOPE":{"default_item":288,"flag":285,"rom_address":2059186},"NPC_GIFT_RECEIVED_EXP_SHARE":{"default_item":182,"flag":272,"rom_address":2179378},"NPC_GIFT_RECEIVED_FOCUS_BAND":{"default_item":196,"flag":283,"rom_address":2331353},"NPC_GIFT_RECEIVED_GOOD_ROD":{"default_item":263,"flag":227,"rom_address":2052491},"NPC_GIFT_RECEIVED_GO_GOGGLES":{"default_item":279,"flag":221,"rom_address":2011954},"NPC_GIFT_RECEIVED_GREAT_BALL_PETALBURG_WOODS":{"default_item":3,"flag":1171,"rom_address":2293794},"NPC_GIFT_RECEIVED_GREAT_BALL_RUSTBORO_CITY":{"default_item":3,"flag":1173,"rom_address":1972558},"NPC_GIFT_RECEIVED_HM01":{"default_item":339,"flag":137,"rom_address":2193371},"NPC_GIFT_RECEIVED_HM02":{"default_item":340,"flag":110,"rom_address":2054604},"NPC_GIFT_RECEIVED_HM03":{"default_item":341,"flag":122,"rom_address":2120645},"NPC_GIFT_RECEIVED_HM04":{"default_item":342,"flag":106,"rom_address":2289001},"NPC_GIFT_RECEIVED_HM05":{"default_item":343,"flag":109,"rom_address":2291966},"NPC_GIFT_RECEIVED_HM06":{"default_item":344,"flag":107,"rom_address":2167989},"NPC_GIFT_RECEIVED_HM07":{"default_item":345,"flag":312,"rom_address":1995198},"NPC_GIFT_RECEIVED_HM08":{"default_item":346,"flag":123,"rom_address":2245872},"NPC_GIFT_RECEIVED_ITEMFINDER":{"default_item":261,"flag":1176,"rom_address":2034013},"NPC_GIFT_RECEIVED_KINGS_ROCK":{"default_item":187,"flag":276,"rom_address":1989011},"NPC_GIFT_RECEIVED_LETTER":{"default_item":274,"flag":1174,"rom_address":2179156},"NPC_GIFT_RECEIVED_MACHO_BRACE":{"default_item":181,"flag":277,"rom_address":2278172},"NPC_GIFT_RECEIVED_MACH_BIKE":{"default_item":259,"flag":1180,"rom_address":2164441},"NPC_GIFT_RECEIVED_MAGMA_EMBLEM":{"default_item":375,"flag":1177,"rom_address":2310318},"NPC_GIFT_RECEIVED_MENTAL_HERB":{"default_item":185,"flag":223,"rom_address":2201924},"NPC_GIFT_RECEIVED_METEORITE":{"default_item":280,"flag":115,"rom_address":2297863},"NPC_GIFT_RECEIVED_MIRACLE_SEED":{"default_item":205,"flag":297,"rom_address":2294010},"NPC_GIFT_RECEIVED_OLD_ROD":{"default_item":262,"flag":257,"rom_address":2007886},"NPC_GIFT_RECEIVED_POKEBLOCK_CASE":{"default_item":273,"flag":95,"rom_address":2606136},"NPC_GIFT_RECEIVED_POTION_OLDALE":{"default_item":13,"flag":132,"rom_address":2006235},"NPC_GIFT_RECEIVED_POWDER_JAR":{"default_item":372,"flag":337,"rom_address":1957927},"NPC_GIFT_RECEIVED_PREMIER_BALL_RUSTBORO":{"default_item":12,"flag":213,"rom_address":2194408},"NPC_GIFT_RECEIVED_QUICK_CLAW":{"default_item":183,"flag":275,"rom_address":2186071},"NPC_GIFT_RECEIVED_REPEAT_BALL":{"default_item":9,"flag":256,"rom_address":2047827},"NPC_GIFT_RECEIVED_SECRET_POWER":{"default_item":331,"flag":96,"rom_address":2591201},"NPC_GIFT_RECEIVED_SILK_SCARF":{"default_item":217,"flag":289,"rom_address":2095828},"NPC_GIFT_RECEIVED_SOFT_SAND":{"default_item":203,"flag":280,"rom_address":2029841},"NPC_GIFT_RECEIVED_SOOTHE_BELL":{"default_item":184,"flag":278,"rom_address":2145210},"NPC_GIFT_RECEIVED_SS_TICKET":{"default_item":265,"flag":291,"rom_address":2708464},"NPC_GIFT_RECEIVED_SUN_STONE_MOSSDEEP":{"default_item":93,"flag":192,"rom_address":2248181},"NPC_GIFT_RECEIVED_SUPER_ROD":{"default_item":264,"flag":152,"rom_address":2245339},"NPC_GIFT_RECEIVED_TM03":{"default_item":291,"flag":172,"rom_address":2256148},"NPC_GIFT_RECEIVED_TM04":{"default_item":292,"flag":171,"rom_address":2237855},"NPC_GIFT_RECEIVED_TM05":{"default_item":293,"flag":231,"rom_address":2045877},"NPC_GIFT_RECEIVED_TM08":{"default_item":296,"flag":166,"rom_address":2089212},"NPC_GIFT_RECEIVED_TM09":{"default_item":297,"flag":262,"rom_address":2023076},"NPC_GIFT_RECEIVED_TM10":{"default_item":298,"flag":264,"rom_address":2200728},"NPC_GIFT_RECEIVED_TM19":{"default_item":307,"flag":232,"rom_address":2062050},"NPC_GIFT_RECEIVED_TM21":{"default_item":309,"flag":1179,"rom_address":2118086},"NPC_GIFT_RECEIVED_TM27":{"default_item":315,"flag":229,"rom_address":2107533},"NPC_GIFT_RECEIVED_TM27_2":{"default_item":315,"flag":1178,"rom_address":2118033},"NPC_GIFT_RECEIVED_TM28":{"default_item":316,"flag":261,"rom_address":2280367},"NPC_GIFT_RECEIVED_TM31":{"default_item":319,"flag":121,"rom_address":2262824},"NPC_GIFT_RECEIVED_TM34":{"default_item":322,"flag":167,"rom_address":2161230},"NPC_GIFT_RECEIVED_TM36":{"default_item":324,"flag":230,"rom_address":2093189},"NPC_GIFT_RECEIVED_TM39":{"default_item":327,"flag":165,"rom_address":2181934},"NPC_GIFT_RECEIVED_TM40":{"default_item":328,"flag":170,"rom_address":2196031},"NPC_GIFT_RECEIVED_TM41":{"default_item":329,"flag":265,"rom_address":2139219},"NPC_GIFT_RECEIVED_TM42":{"default_item":330,"flag":169,"rom_address":2123871},"NPC_GIFT_RECEIVED_TM44":{"default_item":332,"flag":234,"rom_address":2230771},"NPC_GIFT_RECEIVED_TM45":{"default_item":333,"flag":235,"rom_address":2110398},"NPC_GIFT_RECEIVED_TM46":{"default_item":334,"flag":269,"rom_address":2148628},"NPC_GIFT_RECEIVED_TM47":{"default_item":335,"flag":1175,"rom_address":2292543},"NPC_GIFT_RECEIVED_TM49":{"default_item":337,"flag":260,"rom_address":2354181},"NPC_GIFT_RECEIVED_TM50":{"default_item":338,"flag":168,"rom_address":2097316},"NPC_GIFT_RECEIVED_WAILMER_PAIL":{"default_item":268,"flag":94,"rom_address":2278027},"NPC_GIFT_RECEIVED_WHITE_HERB":{"default_item":180,"flag":279,"rom_address":2022938}},"maps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":{"fishing_encounters":null,"header_rom_address":4748492,"land_encounters":null,"warp_table_rom_address":5478884,"water_encounters":null},"MAP_ABANDONED_SHIP_CORRIDORS_1F":{"fishing_encounters":null,"header_rom_address":4748268,"land_encounters":null,"warp_table_rom_address":5477960,"water_encounters":null},"MAP_ABANDONED_SHIP_CORRIDORS_B1F":{"fishing_encounters":null,"header_rom_address":4748324,"land_encounters":null,"warp_table_rom_address":5478288,"water_encounters":null},"MAP_ABANDONED_SHIP_DECK":{"fishing_encounters":null,"header_rom_address":4748240,"land_encounters":null,"warp_table_rom_address":5477852,"water_encounters":null},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":{"fishing_encounters":{"encounter_slots":[129,72,129,72,72,72,72,73,73,73],"rom_address":5589416},"header_rom_address":4748548,"land_encounters":null,"warp_table_rom_address":5478948,"water_encounters":{"encounter_slots":[72,72,72,72,73],"rom_address":5589388}},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":{"fishing_encounters":null,"header_rom_address":4748576,"land_encounters":null,"warp_table_rom_address":5479160,"water_encounters":null},"MAP_ABANDONED_SHIP_ROOMS2_1F":{"fishing_encounters":null,"header_rom_address":4748464,"land_encounters":null,"warp_table_rom_address":5478792,"water_encounters":null},"MAP_ABANDONED_SHIP_ROOMS2_B1F":{"fishing_encounters":null,"header_rom_address":4748380,"land_encounters":null,"warp_table_rom_address":5478524,"water_encounters":null},"MAP_ABANDONED_SHIP_ROOMS_1F":{"fishing_encounters":null,"header_rom_address":4748296,"land_encounters":null,"warp_table_rom_address":5478172,"water_encounters":null},"MAP_ABANDONED_SHIP_ROOMS_B1F":{"fishing_encounters":{"encounter_slots":[129,72,129,72,72,72,72,73,73,73],"rom_address":5586652},"header_rom_address":4748352,"land_encounters":null,"warp_table_rom_address":5478432,"water_encounters":{"encounter_slots":[72,72,72,72,73],"rom_address":5586624}},"MAP_ABANDONED_SHIP_ROOM_B1F":{"fishing_encounters":null,"header_rom_address":4748436,"land_encounters":null,"warp_table_rom_address":5478636,"water_encounters":null},"MAP_ABANDONED_SHIP_UNDERWATER1":{"fishing_encounters":null,"header_rom_address":4748408,"land_encounters":null,"warp_table_rom_address":5478576,"water_encounters":null},"MAP_ABANDONED_SHIP_UNDERWATER2":{"fishing_encounters":null,"header_rom_address":4748520,"land_encounters":null,"warp_table_rom_address":5478920,"water_encounters":null},"MAP_ALTERING_CAVE":{"fishing_encounters":null,"header_rom_address":4749696,"land_encounters":{"encounter_slots":[41,41,41,41,41,41,41,41,41,41,41,41],"rom_address":5593728},"warp_table_rom_address":5482476,"water_encounters":null},"MAP_ANCIENT_TOMB":{"fishing_encounters":null,"header_rom_address":4748632,"land_encounters":null,"warp_table_rom_address":5479500,"water_encounters":null},"MAP_AQUA_HIDEOUT_1F":{"fishing_encounters":null,"header_rom_address":4747372,"land_encounters":null,"warp_table_rom_address":5472932,"water_encounters":null},"MAP_AQUA_HIDEOUT_B1F":{"fishing_encounters":null,"header_rom_address":4747400,"land_encounters":null,"warp_table_rom_address":5473192,"water_encounters":null},"MAP_AQUA_HIDEOUT_B2F":{"fishing_encounters":null,"header_rom_address":4747428,"land_encounters":null,"warp_table_rom_address":5473556,"water_encounters":null},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":{"fishing_encounters":null,"header_rom_address":4748800,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":{"fishing_encounters":null,"header_rom_address":4748828,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":{"fishing_encounters":null,"header_rom_address":4748856,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_ARTISAN_CAVE_1F":{"fishing_encounters":null,"header_rom_address":4749528,"land_encounters":{"encounter_slots":[235,235,235,235,235,235,235,235,235,235,235,235],"rom_address":5593672},"warp_table_rom_address":5482212,"water_encounters":null},"MAP_ARTISAN_CAVE_B1F":{"fishing_encounters":null,"header_rom_address":4749500,"land_encounters":{"encounter_slots":[235,235,235,235,235,235,235,235,235,235,235,235],"rom_address":5593616},"warp_table_rom_address":5482104,"water_encounters":null},"MAP_BATTLE_COLOSSEUM_2P":{"fishing_encounters":null,"header_rom_address":4750424,"land_encounters":null,"warp_table_rom_address":5491892,"water_encounters":null},"MAP_BATTLE_COLOSSEUM_4P":{"fishing_encounters":null,"header_rom_address":4750508,"land_encounters":null,"warp_table_rom_address":5492192,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":{"fishing_encounters":null,"header_rom_address":4752300,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":{"fishing_encounters":null,"header_rom_address":4752272,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":{"fishing_encounters":null,"header_rom_address":4752244,"land_encounters":null,"warp_table_rom_address":5502948,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":{"fishing_encounters":null,"header_rom_address":4752048,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":{"fishing_encounters":null,"header_rom_address":4751992,"land_encounters":null,"warp_table_rom_address":5501116,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":{"fishing_encounters":null,"header_rom_address":4751964,"land_encounters":null,"warp_table_rom_address":5501008,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":{"fishing_encounters":null,"header_rom_address":4752020,"land_encounters":null,"warp_table_rom_address":5501176,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":{"fishing_encounters":null,"header_rom_address":4752384,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":{"fishing_encounters":null,"header_rom_address":4752328,"land_encounters":null,"warp_table_rom_address":5503424,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":{"fishing_encounters":null,"header_rom_address":4752356,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":{"fishing_encounters":null,"header_rom_address":4752132,"land_encounters":null,"warp_table_rom_address":5502156,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":{"fishing_encounters":null,"header_rom_address":4752104,"land_encounters":null,"warp_table_rom_address":5501984,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":{"fishing_encounters":null,"header_rom_address":4752076,"land_encounters":null,"warp_table_rom_address":5501736,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":{"fishing_encounters":null,"header_rom_address":4752440,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":{"fishing_encounters":null,"header_rom_address":4752412,"land_encounters":null,"warp_table_rom_address":5503848,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":{"fishing_encounters":null,"header_rom_address":4752524,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":{"fishing_encounters":null,"header_rom_address":4752496,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":{"fishing_encounters":null,"header_rom_address":4752552,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":{"fishing_encounters":null,"header_rom_address":4752468,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":{"fishing_encounters":null,"header_rom_address":4752188,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":{"fishing_encounters":null,"header_rom_address":4752160,"land_encounters":null,"warp_table_rom_address":5502288,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":{"fishing_encounters":null,"header_rom_address":4752216,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":{"fishing_encounters":null,"header_rom_address":4751684,"land_encounters":null,"warp_table_rom_address":5498736,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":{"fishing_encounters":null,"header_rom_address":4751656,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":{"fishing_encounters":null,"header_rom_address":4751628,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":{"fishing_encounters":null,"header_rom_address":4751600,"land_encounters":null,"warp_table_rom_address":5498472,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":{"fishing_encounters":null,"header_rom_address":4751936,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":{"fishing_encounters":null,"header_rom_address":4751908,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":{"fishing_encounters":null,"header_rom_address":4751880,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":{"fishing_encounters":null,"header_rom_address":4752636,"land_encounters":null,"warp_table_rom_address":5505096,"water_encounters":null},"MAP_BATTLE_FRONTIER_LOUNGE1":{"fishing_encounters":null,"header_rom_address":4752608,"land_encounters":null,"warp_table_rom_address":5504852,"water_encounters":null},"MAP_BATTLE_FRONTIER_LOUNGE2":{"fishing_encounters":null,"header_rom_address":4752664,"land_encounters":null,"warp_table_rom_address":5505260,"water_encounters":null},"MAP_BATTLE_FRONTIER_LOUNGE3":{"fishing_encounters":null,"header_rom_address":4752692,"land_encounters":null,"warp_table_rom_address":5505416,"water_encounters":null},"MAP_BATTLE_FRONTIER_LOUNGE4":{"fishing_encounters":null,"header_rom_address":4752720,"land_encounters":null,"warp_table_rom_address":5505516,"water_encounters":null},"MAP_BATTLE_FRONTIER_LOUNGE5":{"fishing_encounters":null,"header_rom_address":4752776,"land_encounters":null,"warp_table_rom_address":5505700,"water_encounters":null},"MAP_BATTLE_FRONTIER_LOUNGE6":{"fishing_encounters":null,"header_rom_address":4752804,"land_encounters":null,"warp_table_rom_address":5505760,"water_encounters":null},"MAP_BATTLE_FRONTIER_LOUNGE7":{"fishing_encounters":null,"header_rom_address":4752832,"land_encounters":null,"warp_table_rom_address":5505884,"water_encounters":null},"MAP_BATTLE_FRONTIER_LOUNGE8":{"fishing_encounters":null,"header_rom_address":4752888,"land_encounters":null,"warp_table_rom_address":5506140,"water_encounters":null},"MAP_BATTLE_FRONTIER_LOUNGE9":{"fishing_encounters":null,"header_rom_address":4752916,"land_encounters":null,"warp_table_rom_address":5506192,"water_encounters":null},"MAP_BATTLE_FRONTIER_MART":{"fishing_encounters":null,"header_rom_address":4753000,"land_encounters":null,"warp_table_rom_address":5506628,"water_encounters":null},"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":{"fishing_encounters":null,"header_rom_address":4751852,"land_encounters":null,"warp_table_rom_address":5500120,"water_encounters":null},"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":{"fishing_encounters":null,"header_rom_address":4751572,"land_encounters":null,"warp_table_rom_address":5498088,"water_encounters":null},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4752944,"land_encounters":null,"warp_table_rom_address":5506348,"water_encounters":null},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4752972,"land_encounters":null,"warp_table_rom_address":5506488,"water_encounters":null},"MAP_BATTLE_FRONTIER_RANKING_HALL":{"fishing_encounters":null,"header_rom_address":4752580,"land_encounters":null,"warp_table_rom_address":5504600,"water_encounters":null},"MAP_BATTLE_FRONTIER_RECEPTION_GATE":{"fishing_encounters":null,"header_rom_address":4752860,"land_encounters":null,"warp_table_rom_address":5506032,"water_encounters":null},"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":{"fishing_encounters":null,"header_rom_address":4752748,"land_encounters":null,"warp_table_rom_address":5505568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE01":{"fishing_encounters":null,"header_rom_address":4750984,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE02":{"fishing_encounters":null,"header_rom_address":4751012,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE03":{"fishing_encounters":null,"header_rom_address":4751040,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE04":{"fishing_encounters":null,"header_rom_address":4751068,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE05":{"fishing_encounters":null,"header_rom_address":4751096,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE06":{"fishing_encounters":null,"header_rom_address":4751124,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE07":{"fishing_encounters":null,"header_rom_address":4751152,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE08":{"fishing_encounters":null,"header_rom_address":4751180,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE09":{"fishing_encounters":null,"header_rom_address":4751208,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE10":{"fishing_encounters":null,"header_rom_address":4751236,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE11":{"fishing_encounters":null,"header_rom_address":4751264,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE12":{"fishing_encounters":null,"header_rom_address":4751292,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE13":{"fishing_encounters":null,"header_rom_address":4751320,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE14":{"fishing_encounters":null,"header_rom_address":4751348,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE15":{"fishing_encounters":null,"header_rom_address":4751376,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BATTLE_PYRAMID_SQUARE16":{"fishing_encounters":null,"header_rom_address":4751404,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_BIRTH_ISLAND_EXTERIOR":{"fishing_encounters":null,"header_rom_address":4753084,"land_encounters":null,"warp_table_rom_address":5506916,"water_encounters":null},"MAP_BIRTH_ISLAND_HARBOR":{"fishing_encounters":null,"header_rom_address":4753112,"land_encounters":null,"warp_table_rom_address":5506992,"water_encounters":null},"MAP_CAVE_OF_ORIGIN_1F":{"fishing_encounters":null,"header_rom_address":4747792,"land_encounters":{"encounter_slots":[41,41,41,322,322,322,41,41,42,42,42,42],"rom_address":5590196},"warp_table_rom_address":5475480,"water_encounters":null},"MAP_CAVE_OF_ORIGIN_B1F":{"fishing_encounters":null,"header_rom_address":4747904,"land_encounters":null,"warp_table_rom_address":5475648,"water_encounters":null},"MAP_CAVE_OF_ORIGIN_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4747764,"land_encounters":{"encounter_slots":[41,41,41,41,41,41,41,41,42,42,42,42],"rom_address":5590140},"warp_table_rom_address":5475444,"water_encounters":null},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":{"fishing_encounters":null,"header_rom_address":4747820,"land_encounters":{"encounter_slots":[41,41,41,322,322,322,41,41,42,42,42,42],"rom_address":5590252},"warp_table_rom_address":5475516,"water_encounters":null},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":{"fishing_encounters":null,"header_rom_address":4747848,"land_encounters":{"encounter_slots":[41,41,41,322,322,322,41,41,42,42,42,42],"rom_address":5590308},"warp_table_rom_address":5475552,"water_encounters":null},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":{"fishing_encounters":null,"header_rom_address":4747876,"land_encounters":{"encounter_slots":[41,41,41,322,322,322,41,41,42,42,42,42],"rom_address":5590364},"warp_table_rom_address":5475588,"water_encounters":null},"MAP_CONTEST_HALL":{"fishing_encounters":null,"header_rom_address":4750536,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_CONTEST_HALL_BEAUTY":{"fishing_encounters":null,"header_rom_address":4750732,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_CONTEST_HALL_COOL":{"fishing_encounters":null,"header_rom_address":4750788,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_CONTEST_HALL_CUTE":{"fishing_encounters":null,"header_rom_address":4750844,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_CONTEST_HALL_SMART":{"fishing_encounters":null,"header_rom_address":4750816,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_CONTEST_HALL_TOUGH":{"fishing_encounters":null,"header_rom_address":4750760,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_DESERT_RUINS":{"fishing_encounters":null,"header_rom_address":4746896,"land_encounters":null,"warp_table_rom_address":5468868,"water_encounters":null},"MAP_DESERT_UNDERPASS":{"fishing_encounters":null,"header_rom_address":4749472,"land_encounters":{"encounter_slots":[132,370,132,371,132,370,371,132,370,132,371,132],"rom_address":5593560},"warp_table_rom_address":5482052,"water_encounters":null},"MAP_DEWFORD_TOWN":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5591916},"header_rom_address":4740372,"land_encounters":null,"warp_table_rom_address":5417220,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5591888}},"MAP_DEWFORD_TOWN_GYM":{"fishing_encounters":null,"header_rom_address":4742024,"land_encounters":null,"warp_table_rom_address":5442380,"water_encounters":null},"MAP_DEWFORD_TOWN_HALL":{"fishing_encounters":null,"header_rom_address":4742052,"land_encounters":null,"warp_table_rom_address":5442680,"water_encounters":null},"MAP_DEWFORD_TOWN_HOUSE1":{"fishing_encounters":null,"header_rom_address":4741940,"land_encounters":null,"warp_table_rom_address":5441896,"water_encounters":null},"MAP_DEWFORD_TOWN_HOUSE2":{"fishing_encounters":null,"header_rom_address":4742080,"land_encounters":null,"warp_table_rom_address":5442788,"water_encounters":null},"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4741968,"land_encounters":null,"warp_table_rom_address":5442004,"water_encounters":null},"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4741996,"land_encounters":null,"warp_table_rom_address":5442144,"water_encounters":null},"MAP_EVER_GRANDE_CITY":{"fishing_encounters":{"encounter_slots":[129,72,129,325,313,325,313,222,313,313],"rom_address":5592220},"header_rom_address":4740288,"land_encounters":null,"warp_table_rom_address":5416112,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5592192}},"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":{"fishing_encounters":null,"header_rom_address":4746084,"land_encounters":null,"warp_table_rom_address":5465760,"water_encounters":null},"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":{"fishing_encounters":null,"header_rom_address":4746056,"land_encounters":null,"warp_table_rom_address":5465652,"water_encounters":null},"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":{"fishing_encounters":null,"header_rom_address":4746028,"land_encounters":null,"warp_table_rom_address":5465592,"water_encounters":null},"MAP_EVER_GRANDE_CITY_HALL1":{"fishing_encounters":null,"header_rom_address":4746112,"land_encounters":null,"warp_table_rom_address":5465796,"water_encounters":null},"MAP_EVER_GRANDE_CITY_HALL2":{"fishing_encounters":null,"header_rom_address":4746140,"land_encounters":null,"warp_table_rom_address":5465848,"water_encounters":null},"MAP_EVER_GRANDE_CITY_HALL3":{"fishing_encounters":null,"header_rom_address":4746168,"land_encounters":null,"warp_table_rom_address":5465900,"water_encounters":null},"MAP_EVER_GRANDE_CITY_HALL4":{"fishing_encounters":null,"header_rom_address":4746196,"land_encounters":null,"warp_table_rom_address":5465952,"water_encounters":null},"MAP_EVER_GRANDE_CITY_HALL5":{"fishing_encounters":null,"header_rom_address":4746224,"land_encounters":null,"warp_table_rom_address":5465988,"water_encounters":null},"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":{"fishing_encounters":null,"header_rom_address":4746280,"land_encounters":null,"warp_table_rom_address":5466220,"water_encounters":null},"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":{"fishing_encounters":null,"header_rom_address":4746000,"land_encounters":null,"warp_table_rom_address":5465532,"water_encounters":null},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4746308,"land_encounters":null,"warp_table_rom_address":5466344,"water_encounters":null},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4746336,"land_encounters":null,"warp_table_rom_address":5466484,"water_encounters":null},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":{"fishing_encounters":null,"header_rom_address":4746252,"land_encounters":null,"warp_table_rom_address":5466136,"water_encounters":null},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":{"fishing_encounters":null,"header_rom_address":4746364,"land_encounters":null,"warp_table_rom_address":5466624,"water_encounters":null},"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":{"fishing_encounters":null,"header_rom_address":4745972,"land_encounters":null,"warp_table_rom_address":5465472,"water_encounters":null},"MAP_FALLARBOR_TOWN":{"fishing_encounters":null,"header_rom_address":4740428,"land_encounters":null,"warp_table_rom_address":5417832,"water_encounters":null},"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":{"fishing_encounters":null,"header_rom_address":4742388,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":{"fishing_encounters":null,"header_rom_address":4742360,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":{"fishing_encounters":null,"header_rom_address":4742332,"land_encounters":null,"warp_table_rom_address":5444416,"water_encounters":null},"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":{"fishing_encounters":null,"header_rom_address":4742472,"land_encounters":null,"warp_table_rom_address":5444928,"water_encounters":null},"MAP_FALLARBOR_TOWN_MART":{"fishing_encounters":null,"header_rom_address":4742304,"land_encounters":null,"warp_table_rom_address":5444260,"water_encounters":null},"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":{"fishing_encounters":null,"header_rom_address":4742500,"land_encounters":null,"warp_table_rom_address":5444988,"water_encounters":null},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4742416,"land_encounters":null,"warp_table_rom_address":5444696,"water_encounters":null},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4742444,"land_encounters":null,"warp_table_rom_address":5444836,"water_encounters":null},"MAP_FARAWAY_ISLAND_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4753028,"land_encounters":null,"warp_table_rom_address":5506712,"water_encounters":null},"MAP_FARAWAY_ISLAND_INTERIOR":{"fishing_encounters":null,"header_rom_address":4753056,"land_encounters":null,"warp_table_rom_address":5506832,"water_encounters":null},"MAP_FIERY_PATH":{"fishing_encounters":null,"header_rom_address":4747120,"land_encounters":{"encounter_slots":[339,109,339,66,321,218,109,66,321,321,88,88],"rom_address":5586784},"warp_table_rom_address":5471384,"water_encounters":null},"MAP_FORTREE_CITY":{"fishing_encounters":null,"header_rom_address":4740176,"land_encounters":null,"warp_table_rom_address":5413740,"water_encounters":null},"MAP_FORTREE_CITY_DECORATION_SHOP":{"fishing_encounters":null,"header_rom_address":4744516,"land_encounters":null,"warp_table_rom_address":5455976,"water_encounters":null},"MAP_FORTREE_CITY_GYM":{"fishing_encounters":null,"header_rom_address":4744292,"land_encounters":null,"warp_table_rom_address":5455024,"water_encounters":null},"MAP_FORTREE_CITY_HOUSE1":{"fishing_encounters":null,"header_rom_address":4744264,"land_encounters":null,"warp_table_rom_address":5454796,"water_encounters":null},"MAP_FORTREE_CITY_HOUSE2":{"fishing_encounters":null,"header_rom_address":4744404,"land_encounters":null,"warp_table_rom_address":5455544,"water_encounters":null},"MAP_FORTREE_CITY_HOUSE3":{"fishing_encounters":null,"header_rom_address":4744432,"land_encounters":null,"warp_table_rom_address":5455628,"water_encounters":null},"MAP_FORTREE_CITY_HOUSE4":{"fishing_encounters":null,"header_rom_address":4744460,"land_encounters":null,"warp_table_rom_address":5455736,"water_encounters":null},"MAP_FORTREE_CITY_HOUSE5":{"fishing_encounters":null,"header_rom_address":4744488,"land_encounters":null,"warp_table_rom_address":5455844,"water_encounters":null},"MAP_FORTREE_CITY_MART":{"fishing_encounters":null,"header_rom_address":4744376,"land_encounters":null,"warp_table_rom_address":5455460,"water_encounters":null},"MAP_FORTREE_CITY_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4744320,"land_encounters":null,"warp_table_rom_address":5455180,"water_encounters":null},"MAP_FORTREE_CITY_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4744348,"land_encounters":null,"warp_table_rom_address":5455320,"water_encounters":null},"MAP_GRANITE_CAVE_1F":{"fishing_encounters":null,"header_rom_address":4746924,"land_encounters":{"encounter_slots":[41,335,335,41,335,63,335,335,74,74,74,74],"rom_address":5586316},"warp_table_rom_address":5468996,"water_encounters":null},"MAP_GRANITE_CAVE_B1F":{"fishing_encounters":null,"header_rom_address":4746952,"land_encounters":{"encounter_slots":[41,382,382,382,41,63,335,335,322,322,322,322],"rom_address":5586372},"warp_table_rom_address":5469072,"water_encounters":null},"MAP_GRANITE_CAVE_B2F":{"fishing_encounters":null,"header_rom_address":4746980,"land_encounters":{"encounter_slots":[41,382,382,41,382,63,322,322,322,322,322,322],"rom_address":5586700},"warp_table_rom_address":5469364,"water_encounters":null},"MAP_GRANITE_CAVE_STEVENS_ROOM":{"fishing_encounters":null,"header_rom_address":4747008,"land_encounters":{"encounter_slots":[41,335,335,41,335,63,335,335,382,382,382,382],"rom_address":5588516},"warp_table_rom_address":5469472,"water_encounters":null},"MAP_INSIDE_OF_TRUCK":{"fishing_encounters":null,"header_rom_address":4750872,"land_encounters":null,"warp_table_rom_address":5492760,"water_encounters":null},"MAP_ISLAND_CAVE":{"fishing_encounters":null,"header_rom_address":4748604,"land_encounters":null,"warp_table_rom_address":5479396,"water_encounters":null},"MAP_JAGGED_PASS":{"fishing_encounters":null,"header_rom_address":4747092,"land_encounters":{"encounter_slots":[339,339,66,339,351,66,351,66,339,351,339,351],"rom_address":5586972},"warp_table_rom_address":5470948,"water_encounters":null},"MAP_LAVARIDGE_TOWN":{"fishing_encounters":null,"header_rom_address":4740400,"land_encounters":null,"warp_table_rom_address":5417556,"water_encounters":null},"MAP_LAVARIDGE_TOWN_GYM_1F":{"fishing_encounters":null,"header_rom_address":4742136,"land_encounters":null,"warp_table_rom_address":5443076,"water_encounters":null},"MAP_LAVARIDGE_TOWN_GYM_B1F":{"fishing_encounters":null,"header_rom_address":4742164,"land_encounters":null,"warp_table_rom_address":5443424,"water_encounters":null},"MAP_LAVARIDGE_TOWN_HERB_SHOP":{"fishing_encounters":null,"header_rom_address":4742108,"land_encounters":null,"warp_table_rom_address":5442896,"water_encounters":null},"MAP_LAVARIDGE_TOWN_HOUSE":{"fishing_encounters":null,"header_rom_address":4742192,"land_encounters":null,"warp_table_rom_address":5443708,"water_encounters":null},"MAP_LAVARIDGE_TOWN_MART":{"fishing_encounters":null,"header_rom_address":4742220,"land_encounters":null,"warp_table_rom_address":5443816,"water_encounters":null},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4742248,"land_encounters":null,"warp_table_rom_address":5443948,"water_encounters":null},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4742276,"land_encounters":null,"warp_table_rom_address":5444096,"water_encounters":null},"MAP_LILYCOVE_CITY":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,120,313,313],"rom_address":5591840},"header_rom_address":4740204,"land_encounters":null,"warp_table_rom_address":5414432,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5591812}},"MAP_LILYCOVE_CITY_CONTEST_HALL":{"fishing_encounters":null,"header_rom_address":4744684,"land_encounters":null,"warp_table_rom_address":5458600,"water_encounters":null},"MAP_LILYCOVE_CITY_CONTEST_LOBBY":{"fishing_encounters":null,"header_rom_address":4744656,"land_encounters":null,"warp_table_rom_address":5457636,"water_encounters":null},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":{"fishing_encounters":null,"header_rom_address":4744544,"land_encounters":null,"warp_table_rom_address":5456036,"water_encounters":null},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":{"fishing_encounters":null,"header_rom_address":4744572,"land_encounters":null,"warp_table_rom_address":5456264,"water_encounters":null},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":{"fishing_encounters":null,"header_rom_address":4744992,"land_encounters":null,"warp_table_rom_address":5460084,"water_encounters":null},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":{"fishing_encounters":null,"header_rom_address":4745020,"land_encounters":null,"warp_table_rom_address":5460268,"water_encounters":null},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":{"fishing_encounters":null,"header_rom_address":4745048,"land_encounters":null,"warp_table_rom_address":5460432,"water_encounters":null},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":{"fishing_encounters":null,"header_rom_address":4745076,"land_encounters":null,"warp_table_rom_address":5460596,"water_encounters":null},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":{"fishing_encounters":null,"header_rom_address":4745104,"land_encounters":null,"warp_table_rom_address":5460808,"water_encounters":null},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":{"fishing_encounters":null,"header_rom_address":4745160,"land_encounters":null,"warp_table_rom_address":5461024,"water_encounters":null},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":{"fishing_encounters":null,"header_rom_address":4745132,"land_encounters":null,"warp_table_rom_address":5460948,"water_encounters":null},"MAP_LILYCOVE_CITY_HARBOR":{"fishing_encounters":null,"header_rom_address":4744824,"land_encounters":null,"warp_table_rom_address":5459436,"water_encounters":null},"MAP_LILYCOVE_CITY_HOUSE1":{"fishing_encounters":null,"header_rom_address":4744880,"land_encounters":null,"warp_table_rom_address":5459580,"water_encounters":null},"MAP_LILYCOVE_CITY_HOUSE2":{"fishing_encounters":null,"header_rom_address":4744908,"land_encounters":null,"warp_table_rom_address":5459640,"water_encounters":null},"MAP_LILYCOVE_CITY_HOUSE3":{"fishing_encounters":null,"header_rom_address":4744936,"land_encounters":null,"warp_table_rom_address":5459820,"water_encounters":null},"MAP_LILYCOVE_CITY_HOUSE4":{"fishing_encounters":null,"header_rom_address":4744964,"land_encounters":null,"warp_table_rom_address":5459904,"water_encounters":null},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":{"fishing_encounters":null,"header_rom_address":4744600,"land_encounters":null,"warp_table_rom_address":5456532,"water_encounters":null},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":{"fishing_encounters":null,"header_rom_address":4744628,"land_encounters":null,"warp_table_rom_address":5456864,"water_encounters":null},"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":{"fishing_encounters":null,"header_rom_address":4744852,"land_encounters":null,"warp_table_rom_address":5459496,"water_encounters":null},"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4744712,"land_encounters":null,"warp_table_rom_address":5458844,"water_encounters":null},"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4744740,"land_encounters":null,"warp_table_rom_address":5458984,"water_encounters":null},"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":{"fishing_encounters":null,"header_rom_address":4744796,"land_encounters":null,"warp_table_rom_address":5459280,"water_encounters":null},"MAP_LILYCOVE_CITY_UNUSED_MART":{"fishing_encounters":null,"header_rom_address":4744768,"land_encounters":null,"warp_table_rom_address":5459028,"water_encounters":null},"MAP_LITTLEROOT_TOWN":{"fishing_encounters":null,"header_rom_address":4740316,"land_encounters":null,"warp_table_rom_address":5416592,"water_encounters":null},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":{"fishing_encounters":null,"header_rom_address":4741660,"land_encounters":null,"warp_table_rom_address":5439628,"water_encounters":null},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":{"fishing_encounters":null,"header_rom_address":4741688,"land_encounters":null,"warp_table_rom_address":5440120,"water_encounters":null},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":{"fishing_encounters":null,"header_rom_address":4741716,"land_encounters":null,"warp_table_rom_address":5440364,"water_encounters":null},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":{"fishing_encounters":null,"header_rom_address":4741744,"land_encounters":null,"warp_table_rom_address":5440856,"water_encounters":null},"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":{"fishing_encounters":null,"header_rom_address":4741772,"land_encounters":null,"warp_table_rom_address":5441076,"water_encounters":null},"MAP_MAGMA_HIDEOUT_1F":{"fishing_encounters":null,"header_rom_address":4749136,"land_encounters":{"encounter_slots":[74,321,74,321,74,74,74,75,75,75,75,75],"rom_address":5592888},"warp_table_rom_address":5480884,"water_encounters":null},"MAP_MAGMA_HIDEOUT_2F_1R":{"fishing_encounters":null,"header_rom_address":4749164,"land_encounters":{"encounter_slots":[74,321,74,321,74,74,74,75,75,75,75,75],"rom_address":5592944},"warp_table_rom_address":5481032,"water_encounters":null},"MAP_MAGMA_HIDEOUT_2F_2R":{"fishing_encounters":null,"header_rom_address":4749192,"land_encounters":{"encounter_slots":[74,321,74,321,74,74,74,75,75,75,75,75],"rom_address":5593000},"warp_table_rom_address":5481220,"water_encounters":null},"MAP_MAGMA_HIDEOUT_2F_3R":{"fishing_encounters":null,"header_rom_address":4749332,"land_encounters":{"encounter_slots":[74,321,74,321,74,74,74,75,75,75,75,75],"rom_address":5593280},"warp_table_rom_address":5481736,"water_encounters":null},"MAP_MAGMA_HIDEOUT_3F_1R":{"fishing_encounters":null,"header_rom_address":4749220,"land_encounters":{"encounter_slots":[74,321,74,321,74,74,74,75,75,75,75,75],"rom_address":5593056},"warp_table_rom_address":5481328,"water_encounters":null},"MAP_MAGMA_HIDEOUT_3F_2R":{"fishing_encounters":null,"header_rom_address":4749248,"land_encounters":{"encounter_slots":[74,321,74,321,74,74,74,75,75,75,75,75],"rom_address":5593112},"warp_table_rom_address":5481420,"water_encounters":null},"MAP_MAGMA_HIDEOUT_3F_3R":{"fishing_encounters":null,"header_rom_address":4749304,"land_encounters":{"encounter_slots":[74,321,74,321,74,74,74,75,75,75,75,75],"rom_address":5593224},"warp_table_rom_address":5481700,"water_encounters":null},"MAP_MAGMA_HIDEOUT_4F":{"fishing_encounters":null,"header_rom_address":4749276,"land_encounters":{"encounter_slots":[74,321,74,321,74,74,74,75,75,75,75,75],"rom_address":5593168},"warp_table_rom_address":5481640,"water_encounters":null},"MAP_MARINE_CAVE_END":{"fishing_encounters":null,"header_rom_address":4749612,"land_encounters":null,"warp_table_rom_address":5482328,"water_encounters":null},"MAP_MARINE_CAVE_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4749584,"land_encounters":null,"warp_table_rom_address":5482276,"water_encounters":null},"MAP_MAUVILLE_CITY":{"fishing_encounters":null,"header_rom_address":4740120,"land_encounters":null,"warp_table_rom_address":5412444,"water_encounters":null},"MAP_MAUVILLE_CITY_BIKE_SHOP":{"fishing_encounters":null,"header_rom_address":4743592,"land_encounters":null,"warp_table_rom_address":5451272,"water_encounters":null},"MAP_MAUVILLE_CITY_GAME_CORNER":{"fishing_encounters":null,"header_rom_address":4743648,"land_encounters":null,"warp_table_rom_address":5451680,"water_encounters":null},"MAP_MAUVILLE_CITY_GYM":{"fishing_encounters":null,"header_rom_address":4743564,"land_encounters":null,"warp_table_rom_address":5451100,"water_encounters":null},"MAP_MAUVILLE_CITY_HOUSE1":{"fishing_encounters":null,"header_rom_address":4743620,"land_encounters":null,"warp_table_rom_address":5451356,"water_encounters":null},"MAP_MAUVILLE_CITY_HOUSE2":{"fishing_encounters":null,"header_rom_address":4743676,"land_encounters":null,"warp_table_rom_address":5452028,"water_encounters":null},"MAP_MAUVILLE_CITY_MART":{"fishing_encounters":null,"header_rom_address":4743760,"land_encounters":null,"warp_table_rom_address":5452464,"water_encounters":null},"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4743704,"land_encounters":null,"warp_table_rom_address":5452184,"water_encounters":null},"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4743732,"land_encounters":null,"warp_table_rom_address":5452348,"water_encounters":null},"MAP_METEOR_FALLS_1F_1R":{"fishing_encounters":{"encounter_slots":[129,118,129,118,323,323,323,323,323,323],"rom_address":5591124},"header_rom_address":4746728,"land_encounters":{"encounter_slots":[41,41,41,41,41,349,349,349,41,41,41,41],"rom_address":5591040},"warp_table_rom_address":5468092,"water_encounters":{"encounter_slots":[41,41,349,349,349],"rom_address":5591096}},"MAP_METEOR_FALLS_1F_2R":{"fishing_encounters":{"encounter_slots":[129,118,129,118,323,323,323,324,324,324],"rom_address":5591256},"header_rom_address":4746756,"land_encounters":{"encounter_slots":[42,42,42,349,349,349,42,349,42,42,42,42],"rom_address":5591172},"warp_table_rom_address":5468260,"water_encounters":{"encounter_slots":[42,42,349,349,349],"rom_address":5591228}},"MAP_METEOR_FALLS_B1F_1R":{"fishing_encounters":{"encounter_slots":[129,118,129,118,323,323,323,324,324,324],"rom_address":5591388},"header_rom_address":4746784,"land_encounters":{"encounter_slots":[42,42,42,349,349,349,42,349,42,42,42,42],"rom_address":5591304},"warp_table_rom_address":5468324,"water_encounters":{"encounter_slots":[42,42,349,349,349],"rom_address":5591360}},"MAP_METEOR_FALLS_B1F_2R":{"fishing_encounters":{"encounter_slots":[129,118,129,118,323,323,323,324,324,324],"rom_address":5586924},"header_rom_address":4746812,"land_encounters":{"encounter_slots":[42,42,395,349,395,349,395,349,42,42,42,42],"rom_address":5586840},"warp_table_rom_address":5468416,"water_encounters":{"encounter_slots":[42,42,349,349,349],"rom_address":5586896}},"MAP_METEOR_FALLS_STEVENS_CAVE":{"fishing_encounters":null,"header_rom_address":4749724,"land_encounters":{"encounter_slots":[42,42,42,349,349,349,42,349,42,42,42,42],"rom_address":5594232},"warp_table_rom_address":5482528,"water_encounters":null},"MAP_MIRAGE_TOWER_1F":{"fishing_encounters":null,"header_rom_address":4749360,"land_encounters":{"encounter_slots":[27,332,27,332,27,332,27,332,27,332,27,332],"rom_address":5593336},"warp_table_rom_address":5481772,"water_encounters":null},"MAP_MIRAGE_TOWER_2F":{"fishing_encounters":null,"header_rom_address":4749388,"land_encounters":{"encounter_slots":[27,332,27,332,27,332,27,332,27,332,27,332],"rom_address":5593392},"warp_table_rom_address":5481808,"water_encounters":null},"MAP_MIRAGE_TOWER_3F":{"fishing_encounters":null,"header_rom_address":4749416,"land_encounters":{"encounter_slots":[27,332,27,332,27,332,27,332,27,332,27,332],"rom_address":5593448},"warp_table_rom_address":5481892,"water_encounters":null},"MAP_MIRAGE_TOWER_4F":{"fishing_encounters":null,"header_rom_address":4749444,"land_encounters":{"encounter_slots":[27,332,27,332,27,332,27,332,27,332,27,332],"rom_address":5593504},"warp_table_rom_address":5482000,"water_encounters":null},"MAP_MOSSDEEP_CITY":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,313,313,313],"rom_address":5592068},"header_rom_address":4740232,"land_encounters":null,"warp_table_rom_address":5415128,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5592040}},"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":{"fishing_encounters":null,"header_rom_address":4745496,"land_encounters":null,"warp_table_rom_address":5463752,"water_encounters":null},"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":{"fishing_encounters":null,"header_rom_address":4745524,"land_encounters":null,"warp_table_rom_address":5463856,"water_encounters":null},"MAP_MOSSDEEP_CITY_GYM":{"fishing_encounters":null,"header_rom_address":4745188,"land_encounters":null,"warp_table_rom_address":5461924,"water_encounters":null},"MAP_MOSSDEEP_CITY_HOUSE1":{"fishing_encounters":null,"header_rom_address":4745216,"land_encounters":null,"warp_table_rom_address":5462272,"water_encounters":null},"MAP_MOSSDEEP_CITY_HOUSE2":{"fishing_encounters":null,"header_rom_address":4745244,"land_encounters":null,"warp_table_rom_address":5462380,"water_encounters":null},"MAP_MOSSDEEP_CITY_HOUSE3":{"fishing_encounters":null,"header_rom_address":4745356,"land_encounters":null,"warp_table_rom_address":5462852,"water_encounters":null},"MAP_MOSSDEEP_CITY_HOUSE4":{"fishing_encounters":null,"header_rom_address":4745412,"land_encounters":null,"warp_table_rom_address":5463116,"water_encounters":null},"MAP_MOSSDEEP_CITY_MART":{"fishing_encounters":null,"header_rom_address":4745328,"land_encounters":null,"warp_table_rom_address":5462792,"water_encounters":null},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4745272,"land_encounters":null,"warp_table_rom_address":5462488,"water_encounters":null},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4745300,"land_encounters":null,"warp_table_rom_address":5462652,"water_encounters":null},"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4745440,"land_encounters":null,"warp_table_rom_address":5463416,"water_encounters":null},"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4745468,"land_encounters":null,"warp_table_rom_address":5463676,"water_encounters":null},"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":{"fishing_encounters":null,"header_rom_address":4745384,"land_encounters":null,"warp_table_rom_address":5462960,"water_encounters":null},"MAP_MT_CHIMNEY":{"fishing_encounters":null,"header_rom_address":4747064,"land_encounters":null,"warp_table_rom_address":5470704,"water_encounters":null},"MAP_MT_CHIMNEY_CABLE_CAR_STATION":{"fishing_encounters":null,"header_rom_address":4746532,"land_encounters":null,"warp_table_rom_address":5467184,"water_encounters":null},"MAP_MT_PYRE_1F":{"fishing_encounters":null,"header_rom_address":4747148,"land_encounters":{"encounter_slots":[377,377,377,377,377,377,377,377,377,377,377,377],"rom_address":5586428},"warp_table_rom_address":5471492,"water_encounters":null},"MAP_MT_PYRE_2F":{"fishing_encounters":null,"header_rom_address":4747176,"land_encounters":{"encounter_slots":[377,377,377,377,377,377,377,377,377,377,377,377],"rom_address":5588124},"warp_table_rom_address":5471752,"water_encounters":null},"MAP_MT_PYRE_3F":{"fishing_encounters":null,"header_rom_address":4747204,"land_encounters":{"encounter_slots":[377,377,377,377,377,377,377,377,377,377,377,377],"rom_address":5588180},"warp_table_rom_address":5471908,"water_encounters":null},"MAP_MT_PYRE_4F":{"fishing_encounters":null,"header_rom_address":4747232,"land_encounters":{"encounter_slots":[377,377,377,377,377,377,377,377,361,361,361,361],"rom_address":5588236},"warp_table_rom_address":5472024,"water_encounters":null},"MAP_MT_PYRE_5F":{"fishing_encounters":null,"header_rom_address":4747260,"land_encounters":{"encounter_slots":[377,377,377,377,377,377,377,377,361,361,361,361],"rom_address":5588292},"warp_table_rom_address":5472140,"water_encounters":null},"MAP_MT_PYRE_6F":{"fishing_encounters":null,"header_rom_address":4747288,"land_encounters":{"encounter_slots":[377,377,377,377,377,377,377,377,361,361,361,361],"rom_address":5588348},"warp_table_rom_address":5472272,"water_encounters":null},"MAP_MT_PYRE_EXTERIOR":{"fishing_encounters":null,"header_rom_address":4747316,"land_encounters":{"encounter_slots":[377,377,377,377,37,37,37,37,309,309,309,309],"rom_address":5588404},"warp_table_rom_address":5472356,"water_encounters":null},"MAP_MT_PYRE_SUMMIT":{"fishing_encounters":null,"header_rom_address":4747344,"land_encounters":{"encounter_slots":[377,377,377,377,377,377,377,361,361,361,411,411],"rom_address":5588460},"warp_table_rom_address":5472696,"water_encounters":null},"MAP_NAVEL_ROCK_B1F":{"fishing_encounters":null,"header_rom_address":4753392,"land_encounters":null,"warp_table_rom_address":5507564,"water_encounters":null},"MAP_NAVEL_ROCK_BOTTOM":{"fishing_encounters":null,"header_rom_address":4753896,"land_encounters":null,"warp_table_rom_address":5508288,"water_encounters":null},"MAP_NAVEL_ROCK_DOWN01":{"fishing_encounters":null,"header_rom_address":4753588,"land_encounters":null,"warp_table_rom_address":5507868,"water_encounters":null},"MAP_NAVEL_ROCK_DOWN02":{"fishing_encounters":null,"header_rom_address":4753616,"land_encounters":null,"warp_table_rom_address":5507904,"water_encounters":null},"MAP_NAVEL_ROCK_DOWN03":{"fishing_encounters":null,"header_rom_address":4753644,"land_encounters":null,"warp_table_rom_address":5507940,"water_encounters":null},"MAP_NAVEL_ROCK_DOWN04":{"fishing_encounters":null,"header_rom_address":4753672,"land_encounters":null,"warp_table_rom_address":5507976,"water_encounters":null},"MAP_NAVEL_ROCK_DOWN05":{"fishing_encounters":null,"header_rom_address":4753700,"land_encounters":null,"warp_table_rom_address":5508012,"water_encounters":null},"MAP_NAVEL_ROCK_DOWN06":{"fishing_encounters":null,"header_rom_address":4753728,"land_encounters":null,"warp_table_rom_address":5508048,"water_encounters":null},"MAP_NAVEL_ROCK_DOWN07":{"fishing_encounters":null,"header_rom_address":4753756,"land_encounters":null,"warp_table_rom_address":5508084,"water_encounters":null},"MAP_NAVEL_ROCK_DOWN08":{"fishing_encounters":null,"header_rom_address":4753784,"land_encounters":null,"warp_table_rom_address":5508120,"water_encounters":null},"MAP_NAVEL_ROCK_DOWN09":{"fishing_encounters":null,"header_rom_address":4753812,"land_encounters":null,"warp_table_rom_address":5508156,"water_encounters":null},"MAP_NAVEL_ROCK_DOWN10":{"fishing_encounters":null,"header_rom_address":4753840,"land_encounters":null,"warp_table_rom_address":5508192,"water_encounters":null},"MAP_NAVEL_ROCK_DOWN11":{"fishing_encounters":null,"header_rom_address":4753868,"land_encounters":null,"warp_table_rom_address":5508228,"water_encounters":null},"MAP_NAVEL_ROCK_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4753364,"land_encounters":null,"warp_table_rom_address":5507528,"water_encounters":null},"MAP_NAVEL_ROCK_EXTERIOR":{"fishing_encounters":null,"header_rom_address":4753308,"land_encounters":null,"warp_table_rom_address":5507416,"water_encounters":null},"MAP_NAVEL_ROCK_FORK":{"fishing_encounters":null,"header_rom_address":4753420,"land_encounters":null,"warp_table_rom_address":5507600,"water_encounters":null},"MAP_NAVEL_ROCK_HARBOR":{"fishing_encounters":null,"header_rom_address":4753336,"land_encounters":null,"warp_table_rom_address":5507500,"water_encounters":null},"MAP_NAVEL_ROCK_TOP":{"fishing_encounters":null,"header_rom_address":4753560,"land_encounters":null,"warp_table_rom_address":5507812,"water_encounters":null},"MAP_NAVEL_ROCK_UP1":{"fishing_encounters":null,"header_rom_address":4753448,"land_encounters":null,"warp_table_rom_address":5507644,"water_encounters":null},"MAP_NAVEL_ROCK_UP2":{"fishing_encounters":null,"header_rom_address":4753476,"land_encounters":null,"warp_table_rom_address":5507680,"water_encounters":null},"MAP_NAVEL_ROCK_UP3":{"fishing_encounters":null,"header_rom_address":4753504,"land_encounters":null,"warp_table_rom_address":5507716,"water_encounters":null},"MAP_NAVEL_ROCK_UP4":{"fishing_encounters":null,"header_rom_address":4753532,"land_encounters":null,"warp_table_rom_address":5507752,"water_encounters":null},"MAP_NEW_MAUVILLE_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4748184,"land_encounters":{"encounter_slots":[100,81,100,81,100,81,100,81,100,81,100,81],"rom_address":5590420},"warp_table_rom_address":5477324,"water_encounters":null},"MAP_NEW_MAUVILLE_INSIDE":{"fishing_encounters":null,"header_rom_address":4748212,"land_encounters":{"encounter_slots":[100,81,100,81,100,81,100,81,100,81,101,82],"rom_address":5587464},"warp_table_rom_address":5477568,"water_encounters":null},"MAP_OLDALE_TOWN":{"fishing_encounters":null,"header_rom_address":4740344,"land_encounters":null,"warp_table_rom_address":5416924,"water_encounters":null},"MAP_OLDALE_TOWN_HOUSE1":{"fishing_encounters":null,"header_rom_address":4741800,"land_encounters":null,"warp_table_rom_address":5441316,"water_encounters":null},"MAP_OLDALE_TOWN_HOUSE2":{"fishing_encounters":null,"header_rom_address":4741828,"land_encounters":null,"warp_table_rom_address":5441400,"water_encounters":null},"MAP_OLDALE_TOWN_MART":{"fishing_encounters":null,"header_rom_address":4741912,"land_encounters":null,"warp_table_rom_address":5441788,"water_encounters":null},"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4741856,"land_encounters":null,"warp_table_rom_address":5441532,"water_encounters":null},"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4741884,"land_encounters":null,"warp_table_rom_address":5441672,"water_encounters":null},"MAP_PACIFIDLOG_TOWN":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,313,313,313],"rom_address":5592144},"header_rom_address":4740484,"land_encounters":null,"warp_table_rom_address":5418328,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5592116}},"MAP_PACIFIDLOG_TOWN_HOUSE1":{"fishing_encounters":null,"header_rom_address":4742836,"land_encounters":null,"warp_table_rom_address":5446440,"water_encounters":null},"MAP_PACIFIDLOG_TOWN_HOUSE2":{"fishing_encounters":null,"header_rom_address":4742864,"land_encounters":null,"warp_table_rom_address":5446548,"water_encounters":null},"MAP_PACIFIDLOG_TOWN_HOUSE3":{"fishing_encounters":null,"header_rom_address":4742892,"land_encounters":null,"warp_table_rom_address":5446632,"water_encounters":null},"MAP_PACIFIDLOG_TOWN_HOUSE4":{"fishing_encounters":null,"header_rom_address":4742920,"land_encounters":null,"warp_table_rom_address":5446740,"water_encounters":null},"MAP_PACIFIDLOG_TOWN_HOUSE5":{"fishing_encounters":null,"header_rom_address":4742948,"land_encounters":null,"warp_table_rom_address":5446824,"water_encounters":null},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4742780,"land_encounters":null,"warp_table_rom_address":5446208,"water_encounters":null},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4742808,"land_encounters":null,"warp_table_rom_address":5446348,"water_encounters":null},"MAP_PETALBURG_CITY":{"fishing_encounters":{"encounter_slots":[129,118,129,118,326,326,326,326,326,326],"rom_address":5592296},"header_rom_address":4740064,"land_encounters":null,"warp_table_rom_address":5410768,"water_encounters":{"encounter_slots":[183,183,183,183,183],"rom_address":5592268}},"MAP_PETALBURG_CITY_GYM":{"fishing_encounters":null,"header_rom_address":4743004,"land_encounters":null,"warp_table_rom_address":5447208,"water_encounters":null},"MAP_PETALBURG_CITY_HOUSE1":{"fishing_encounters":null,"header_rom_address":4743032,"land_encounters":null,"warp_table_rom_address":5447748,"water_encounters":null},"MAP_PETALBURG_CITY_HOUSE2":{"fishing_encounters":null,"header_rom_address":4743060,"land_encounters":null,"warp_table_rom_address":5447832,"water_encounters":null},"MAP_PETALBURG_CITY_MART":{"fishing_encounters":null,"header_rom_address":4743144,"land_encounters":null,"warp_table_rom_address":5448268,"water_encounters":null},"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4743088,"land_encounters":null,"warp_table_rom_address":5447988,"water_encounters":null},"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4743116,"land_encounters":null,"warp_table_rom_address":5448128,"water_encounters":null},"MAP_PETALBURG_CITY_WALLYS_HOUSE":{"fishing_encounters":null,"header_rom_address":4742976,"land_encounters":null,"warp_table_rom_address":5446908,"water_encounters":null},"MAP_PETALBURG_WOODS":{"fishing_encounters":null,"header_rom_address":4747036,"land_encounters":{"encounter_slots":[286,290,306,286,291,293,290,306,304,364,304,364],"rom_address":5586204},"warp_table_rom_address":5469812,"water_encounters":null},"MAP_RECORD_CORNER":{"fishing_encounters":null,"header_rom_address":4750480,"land_encounters":null,"warp_table_rom_address":5492076,"water_encounters":null},"MAP_ROUTE101":{"fishing_encounters":null,"header_rom_address":4740512,"land_encounters":{"encounter_slots":[290,286,290,290,286,286,290,286,288,288,288,288],"rom_address":5584716},"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_ROUTE102":{"fishing_encounters":{"encounter_slots":[129,118,129,118,326,326,326,326,326,326],"rom_address":5584856},"header_rom_address":4740540,"land_encounters":{"encounter_slots":[286,290,286,290,295,295,288,288,288,392,288,298],"rom_address":5584772},"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[183,183,183,183,118],"rom_address":5584828}},"MAP_ROUTE103":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,313,313,313],"rom_address":5584988},"header_rom_address":4740568,"land_encounters":{"encounter_slots":[286,286,286,286,309,288,288,288,309,309,309,309],"rom_address":5584904},"warp_table_rom_address":5419492,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5584960}},"MAP_ROUTE104":{"fishing_encounters":{"encounter_slots":[129,129,129,129,129,129,129,129,129,129],"rom_address":5585120},"header_rom_address":4740596,"land_encounters":{"encounter_slots":[286,290,286,183,183,286,304,304,309,309,309,309],"rom_address":5585036},"warp_table_rom_address":5420348,"water_encounters":{"encounter_slots":[309,309,309,310,310],"rom_address":5585092}},"MAP_ROUTE104_MR_BRINEYS_HOUSE":{"fishing_encounters":null,"header_rom_address":4746392,"land_encounters":null,"warp_table_rom_address":5466716,"water_encounters":null},"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":{"fishing_encounters":null,"header_rom_address":4746420,"land_encounters":null,"warp_table_rom_address":5466824,"water_encounters":null},"MAP_ROUTE104_PROTOTYPE":{"fishing_encounters":null,"header_rom_address":4753952,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":{"fishing_encounters":null,"header_rom_address":4753980,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_ROUTE105":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5585196},"header_rom_address":4740624,"land_encounters":null,"warp_table_rom_address":5420760,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5585168}},"MAP_ROUTE106":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5587056},"header_rom_address":4740652,"land_encounters":null,"warp_table_rom_address":5420932,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5587028}},"MAP_ROUTE107":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5587132},"header_rom_address":4740680,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5587104}},"MAP_ROUTE108":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5587208},"header_rom_address":4740708,"land_encounters":null,"warp_table_rom_address":5421364,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5587180}},"MAP_ROUTE109":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5587284},"header_rom_address":4740736,"land_encounters":null,"warp_table_rom_address":5421980,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5587256}},"MAP_ROUTE109_SEASHORE_HOUSE":{"fishing_encounters":null,"header_rom_address":4754008,"land_encounters":null,"warp_table_rom_address":5508512,"water_encounters":null},"MAP_ROUTE110":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5585328},"header_rom_address":4740764,"land_encounters":{"encounter_slots":[286,337,367,337,354,43,354,367,309,309,353,353],"rom_address":5585244},"warp_table_rom_address":5422968,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5585300}},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4754344,"land_encounters":null,"warp_table_rom_address":5511440,"water_encounters":null},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4754372,"land_encounters":null,"warp_table_rom_address":5511548,"water_encounters":null},"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":{"fishing_encounters":null,"header_rom_address":4754092,"land_encounters":null,"warp_table_rom_address":5508780,"water_encounters":null},"MAP_ROUTE110_TRICK_HOUSE_END":{"fishing_encounters":null,"header_rom_address":4754064,"land_encounters":null,"warp_table_rom_address":5508716,"water_encounters":null},"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4754036,"land_encounters":null,"warp_table_rom_address":5508572,"water_encounters":null},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":{"fishing_encounters":null,"header_rom_address":4754120,"land_encounters":null,"warp_table_rom_address":5509192,"water_encounters":null},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":{"fishing_encounters":null,"header_rom_address":4754148,"land_encounters":null,"warp_table_rom_address":5509368,"water_encounters":null},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":{"fishing_encounters":null,"header_rom_address":4754176,"land_encounters":null,"warp_table_rom_address":5509656,"water_encounters":null},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":{"fishing_encounters":null,"header_rom_address":4754204,"land_encounters":null,"warp_table_rom_address":5510112,"water_encounters":null},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":{"fishing_encounters":null,"header_rom_address":4754232,"land_encounters":null,"warp_table_rom_address":5510288,"water_encounters":null},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":{"fishing_encounters":null,"header_rom_address":4754260,"land_encounters":null,"warp_table_rom_address":5510792,"water_encounters":null},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":{"fishing_encounters":null,"header_rom_address":4754288,"land_encounters":null,"warp_table_rom_address":5511064,"water_encounters":null},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":{"fishing_encounters":null,"header_rom_address":4754316,"land_encounters":null,"warp_table_rom_address":5511360,"water_encounters":null},"MAP_ROUTE111":{"fishing_encounters":{"encounter_slots":[129,118,129,118,323,323,323,323,323,323],"rom_address":5585488},"header_rom_address":4740792,"land_encounters":{"encounter_slots":[27,332,27,332,318,318,27,332,318,344,344,344],"rom_address":5585376},"warp_table_rom_address":5424488,"water_encounters":{"encounter_slots":[183,183,183,183,118],"rom_address":5585432}},"MAP_ROUTE111_OLD_LADYS_REST_STOP":{"fishing_encounters":null,"header_rom_address":4746476,"land_encounters":null,"warp_table_rom_address":5467016,"water_encounters":null},"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":{"fishing_encounters":null,"header_rom_address":4746448,"land_encounters":null,"warp_table_rom_address":5466956,"water_encounters":null},"MAP_ROUTE112":{"fishing_encounters":null,"header_rom_address":4740820,"land_encounters":{"encounter_slots":[339,339,183,339,339,183,339,183,339,339,339,339],"rom_address":5585536},"warp_table_rom_address":5425644,"water_encounters":null},"MAP_ROUTE112_CABLE_CAR_STATION":{"fishing_encounters":null,"header_rom_address":4746504,"land_encounters":null,"warp_table_rom_address":5467100,"water_encounters":null},"MAP_ROUTE113":{"fishing_encounters":null,"header_rom_address":4740848,"land_encounters":{"encounter_slots":[308,308,218,308,308,218,308,218,308,227,308,227],"rom_address":5585592},"warp_table_rom_address":5426132,"water_encounters":null},"MAP_ROUTE113_GLASS_WORKSHOP":{"fishing_encounters":null,"header_rom_address":4754400,"land_encounters":null,"warp_table_rom_address":5511680,"water_encounters":null},"MAP_ROUTE114":{"fishing_encounters":{"encounter_slots":[129,118,129,118,323,323,323,323,323,323],"rom_address":5585760},"header_rom_address":4740876,"land_encounters":{"encounter_slots":[358,295,358,358,295,296,296,296,379,379,379,299],"rom_address":5585648},"warp_table_rom_address":5427224,"water_encounters":{"encounter_slots":[183,183,183,183,118],"rom_address":5585704}},"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":{"fishing_encounters":null,"header_rom_address":4746560,"land_encounters":null,"warp_table_rom_address":5467244,"water_encounters":null},"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":{"fishing_encounters":null,"header_rom_address":4746588,"land_encounters":null,"warp_table_rom_address":5467360,"water_encounters":null},"MAP_ROUTE114_LANETTES_HOUSE":{"fishing_encounters":null,"header_rom_address":4746616,"land_encounters":null,"warp_table_rom_address":5467460,"water_encounters":null},"MAP_ROUTE115":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5587416},"header_rom_address":4740904,"land_encounters":{"encounter_slots":[358,304,358,304,304,305,39,39,309,309,309,309],"rom_address":5587332},"warp_table_rom_address":5428028,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5587388}},"MAP_ROUTE116":{"fishing_encounters":null,"header_rom_address":4740932,"land_encounters":{"encounter_slots":[286,370,301,63,301,304,304,304,286,286,315,315],"rom_address":5585808},"warp_table_rom_address":5428912,"water_encounters":null},"MAP_ROUTE116_TUNNELERS_REST_HOUSE":{"fishing_encounters":null,"header_rom_address":4746644,"land_encounters":null,"warp_table_rom_address":5467604,"water_encounters":null},"MAP_ROUTE117":{"fishing_encounters":{"encounter_slots":[129,118,129,118,326,326,326,326,326,326],"rom_address":5585948},"header_rom_address":4740960,"land_encounters":{"encounter_slots":[286,43,286,43,183,43,387,387,387,387,386,298],"rom_address":5585864},"warp_table_rom_address":5429696,"water_encounters":{"encounter_slots":[183,183,183,183,118],"rom_address":5585920}},"MAP_ROUTE117_POKEMON_DAY_CARE":{"fishing_encounters":null,"header_rom_address":4746672,"land_encounters":null,"warp_table_rom_address":5467664,"water_encounters":null},"MAP_ROUTE118":{"fishing_encounters":{"encounter_slots":[129,72,129,72,330,331,330,330,330,330],"rom_address":5586080},"header_rom_address":4740988,"land_encounters":{"encounter_slots":[288,337,288,337,289,338,309,309,309,309,309,317],"rom_address":5585996},"warp_table_rom_address":5430276,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5586052}},"MAP_ROUTE119":{"fishing_encounters":{"encounter_slots":[129,72,129,72,330,330,330,330,330,330],"rom_address":5587604},"header_rom_address":4741016,"land_encounters":{"encounter_slots":[288,289,288,43,289,43,43,43,369,369,369,317],"rom_address":5587520},"warp_table_rom_address":5431500,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5587576}},"MAP_ROUTE119_HOUSE":{"fishing_encounters":null,"header_rom_address":4754512,"land_encounters":null,"warp_table_rom_address":5512400,"water_encounters":null},"MAP_ROUTE119_WEATHER_INSTITUTE_1F":{"fishing_encounters":null,"header_rom_address":4754456,"land_encounters":null,"warp_table_rom_address":5511920,"water_encounters":null},"MAP_ROUTE119_WEATHER_INSTITUTE_2F":{"fishing_encounters":null,"header_rom_address":4754484,"land_encounters":null,"warp_table_rom_address":5512204,"water_encounters":null},"MAP_ROUTE120":{"fishing_encounters":{"encounter_slots":[129,118,129,118,323,323,323,323,323,323],"rom_address":5587736},"header_rom_address":4741044,"land_encounters":{"encounter_slots":[286,287,287,43,183,43,43,183,376,376,317,298],"rom_address":5587652},"warp_table_rom_address":5433200,"water_encounters":{"encounter_slots":[183,183,183,183,118],"rom_address":5587708}},"MAP_ROUTE121":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5587868},"header_rom_address":4741072,"land_encounters":{"encounter_slots":[286,377,287,377,287,43,43,44,309,309,309,317],"rom_address":5587784},"warp_table_rom_address":5434404,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5587840}},"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4746700,"land_encounters":null,"warp_table_rom_address":5467772,"water_encounters":null},"MAP_ROUTE122":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,313,313,313],"rom_address":5587944},"header_rom_address":4741100,"land_encounters":null,"warp_table_rom_address":5434616,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5587916}},"MAP_ROUTE123":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5588076},"header_rom_address":4741128,"land_encounters":{"encounter_slots":[286,377,287,377,287,43,43,44,309,309,309,317],"rom_address":5587992},"warp_table_rom_address":5435676,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5588048}},"MAP_ROUTE123_BERRY_MASTERS_HOUSE":{"fishing_encounters":null,"header_rom_address":4754428,"land_encounters":null,"warp_table_rom_address":5511764,"water_encounters":null},"MAP_ROUTE124":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,313,313,313],"rom_address":5586156},"header_rom_address":4741156,"land_encounters":null,"warp_table_rom_address":5436476,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5586128}},"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":{"fishing_encounters":null,"header_rom_address":4754540,"land_encounters":null,"warp_table_rom_address":5512460,"water_encounters":null},"MAP_ROUTE125":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,313,313,313],"rom_address":5588600},"header_rom_address":4741184,"land_encounters":null,"warp_table_rom_address":5436756,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5588572}},"MAP_ROUTE126":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,313,313,313],"rom_address":5588676},"header_rom_address":4741212,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5588648}},"MAP_ROUTE127":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,313,313,313],"rom_address":5588752},"header_rom_address":4741240,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5588724}},"MAP_ROUTE128":{"fishing_encounters":{"encounter_slots":[129,72,129,325,313,325,313,222,313,313],"rom_address":5588828},"header_rom_address":4741268,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5588800}},"MAP_ROUTE129":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,313,313,313],"rom_address":5588904},"header_rom_address":4741296,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[72,309,309,310,314],"rom_address":5588876}},"MAP_ROUTE130":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,313,313,313],"rom_address":5589036},"header_rom_address":4741324,"land_encounters":{"encounter_slots":[360,360,360,360,360,360,360,360,360,360,360,360],"rom_address":5588952},"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5589008}},"MAP_ROUTE131":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,313,313,313],"rom_address":5589112},"header_rom_address":4741352,"land_encounters":null,"warp_table_rom_address":5438156,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5589084}},"MAP_ROUTE132":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,116,313,313],"rom_address":5589188},"header_rom_address":4741380,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5589160}},"MAP_ROUTE133":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,116,313,313],"rom_address":5589264},"header_rom_address":4741408,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5589236}},"MAP_ROUTE134":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,331,313,116,313,313],"rom_address":5589340},"header_rom_address":4741436,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5589312}},"MAP_RUSTBORO_CITY":{"fishing_encounters":null,"header_rom_address":4740148,"land_encounters":null,"warp_table_rom_address":5413000,"water_encounters":null},"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":{"fishing_encounters":null,"header_rom_address":4744096,"land_encounters":null,"warp_table_rom_address":5454244,"water_encounters":null},"MAP_RUSTBORO_CITY_DEVON_CORP_1F":{"fishing_encounters":null,"header_rom_address":4743788,"land_encounters":null,"warp_table_rom_address":5452572,"water_encounters":null},"MAP_RUSTBORO_CITY_DEVON_CORP_2F":{"fishing_encounters":null,"header_rom_address":4743816,"land_encounters":null,"warp_table_rom_address":5452784,"water_encounters":null},"MAP_RUSTBORO_CITY_DEVON_CORP_3F":{"fishing_encounters":null,"header_rom_address":4743844,"land_encounters":null,"warp_table_rom_address":5452892,"water_encounters":null},"MAP_RUSTBORO_CITY_FLAT1_1F":{"fishing_encounters":null,"header_rom_address":4744012,"land_encounters":null,"warp_table_rom_address":5453848,"water_encounters":null},"MAP_RUSTBORO_CITY_FLAT1_2F":{"fishing_encounters":null,"header_rom_address":4744040,"land_encounters":null,"warp_table_rom_address":5454084,"water_encounters":null},"MAP_RUSTBORO_CITY_FLAT2_1F":{"fishing_encounters":null,"header_rom_address":4744152,"land_encounters":null,"warp_table_rom_address":5454412,"water_encounters":null},"MAP_RUSTBORO_CITY_FLAT2_2F":{"fishing_encounters":null,"header_rom_address":4744180,"land_encounters":null,"warp_table_rom_address":5454504,"water_encounters":null},"MAP_RUSTBORO_CITY_FLAT2_3F":{"fishing_encounters":null,"header_rom_address":4744208,"land_encounters":null,"warp_table_rom_address":5454588,"water_encounters":null},"MAP_RUSTBORO_CITY_GYM":{"fishing_encounters":null,"header_rom_address":4743872,"land_encounters":null,"warp_table_rom_address":5453064,"water_encounters":null},"MAP_RUSTBORO_CITY_HOUSE1":{"fishing_encounters":null,"header_rom_address":4744068,"land_encounters":null,"warp_table_rom_address":5454160,"water_encounters":null},"MAP_RUSTBORO_CITY_HOUSE2":{"fishing_encounters":null,"header_rom_address":4744124,"land_encounters":null,"warp_table_rom_address":5454328,"water_encounters":null},"MAP_RUSTBORO_CITY_HOUSE3":{"fishing_encounters":null,"header_rom_address":4744236,"land_encounters":null,"warp_table_rom_address":5454688,"water_encounters":null},"MAP_RUSTBORO_CITY_MART":{"fishing_encounters":null,"header_rom_address":4743984,"land_encounters":null,"warp_table_rom_address":5453764,"water_encounters":null},"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4743928,"land_encounters":null,"warp_table_rom_address":5453484,"water_encounters":null},"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4743956,"land_encounters":null,"warp_table_rom_address":5453624,"water_encounters":null},"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":{"fishing_encounters":null,"header_rom_address":4743900,"land_encounters":null,"warp_table_rom_address":5453292,"water_encounters":null},"MAP_RUSTURF_TUNNEL":{"fishing_encounters":null,"header_rom_address":4746840,"land_encounters":{"encounter_slots":[370,370,370,370,370,370,370,370,370,370,370,370],"rom_address":5586260},"warp_table_rom_address":5468684,"water_encounters":null},"MAP_SAFARI_ZONE_NORTH":{"fishing_encounters":null,"header_rom_address":4751488,"land_encounters":{"encounter_slots":[231,43,231,43,177,44,44,177,178,214,178,214],"rom_address":5590608},"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_SAFARI_ZONE_NORTHEAST":{"fishing_encounters":null,"header_rom_address":4751796,"land_encounters":{"encounter_slots":[190,216,190,216,191,165,163,204,228,241,228,241],"rom_address":5592804},"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_SAFARI_ZONE_NORTHWEST":{"fishing_encounters":{"encounter_slots":[129,118,129,118,118,118,118,119,119,119],"rom_address":5590776},"header_rom_address":4751460,"land_encounters":{"encounter_slots":[111,43,111,43,84,44,44,84,85,127,85,127],"rom_address":5590692},"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[54,54,54,55,55],"rom_address":5590748}},"MAP_SAFARI_ZONE_REST_HOUSE":{"fishing_encounters":null,"header_rom_address":4751768,"land_encounters":null,"warp_table_rom_address":5499036,"water_encounters":null},"MAP_SAFARI_ZONE_SOUTH":{"fishing_encounters":null,"header_rom_address":4751544,"land_encounters":{"encounter_slots":[43,43,203,203,177,84,44,202,25,202,25,202],"rom_address":5586540},"warp_table_rom_address":5497484,"water_encounters":null},"MAP_SAFARI_ZONE_SOUTHEAST":{"fishing_encounters":{"encounter_slots":[129,118,129,118,223,118,223,223,223,224],"rom_address":5592756},"header_rom_address":4751824,"land_encounters":{"encounter_slots":[191,179,191,179,190,167,163,209,234,207,234,207],"rom_address":5592672},"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[194,183,183,183,195],"rom_address":5592728}},"MAP_SAFARI_ZONE_SOUTHWEST":{"fishing_encounters":{"encounter_slots":[129,118,129,118,118,118,118,119,119,119],"rom_address":5590560},"header_rom_address":4751516,"land_encounters":{"encounter_slots":[43,43,203,203,177,84,44,202,25,202,25,202],"rom_address":5590476},"warp_table_rom_address":5497300,"water_encounters":{"encounter_slots":[54,54,54,54,54],"rom_address":5590532}},"MAP_SCORCHED_SLAB":{"fishing_encounters":null,"header_rom_address":4748772,"land_encounters":null,"warp_table_rom_address":5480184,"water_encounters":null},"MAP_SEAFLOOR_CAVERN_ENTRANCE":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5590092},"header_rom_address":4747484,"land_encounters":null,"warp_table_rom_address":5473836,"water_encounters":{"encounter_slots":[72,41,41,42,42],"rom_address":5590064}},"MAP_SEAFLOOR_CAVERN_ROOM1":{"fishing_encounters":null,"header_rom_address":4747512,"land_encounters":{"encounter_slots":[41,41,41,41,41,41,41,41,42,42,42,42],"rom_address":5589464},"warp_table_rom_address":5473992,"water_encounters":null},"MAP_SEAFLOOR_CAVERN_ROOM2":{"fishing_encounters":null,"header_rom_address":4747540,"land_encounters":{"encounter_slots":[41,41,41,41,41,41,41,41,42,42,42,42],"rom_address":5589520},"warp_table_rom_address":5474228,"water_encounters":null},"MAP_SEAFLOOR_CAVERN_ROOM3":{"fishing_encounters":null,"header_rom_address":4747568,"land_encounters":{"encounter_slots":[41,41,41,41,41,41,41,41,42,42,42,42],"rom_address":5589576},"warp_table_rom_address":5474496,"water_encounters":null},"MAP_SEAFLOOR_CAVERN_ROOM4":{"fishing_encounters":null,"header_rom_address":4747596,"land_encounters":{"encounter_slots":[41,41,41,41,41,41,41,41,42,42,42,42],"rom_address":5589632},"warp_table_rom_address":5474588,"water_encounters":null},"MAP_SEAFLOOR_CAVERN_ROOM5":{"fishing_encounters":null,"header_rom_address":4747624,"land_encounters":{"encounter_slots":[41,41,41,41,41,41,41,41,42,42,42,42],"rom_address":5589688},"warp_table_rom_address":5474784,"water_encounters":null},"MAP_SEAFLOOR_CAVERN_ROOM6":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5589828},"header_rom_address":4747652,"land_encounters":{"encounter_slots":[41,41,41,41,41,41,41,41,42,42,42,42],"rom_address":5589744},"warp_table_rom_address":5474828,"water_encounters":{"encounter_slots":[72,41,41,42,42],"rom_address":5589800}},"MAP_SEAFLOOR_CAVERN_ROOM7":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5589960},"header_rom_address":4747680,"land_encounters":{"encounter_slots":[41,41,41,41,41,41,41,41,42,42,42,42],"rom_address":5589876},"warp_table_rom_address":5474872,"water_encounters":{"encounter_slots":[72,41,41,42,42],"rom_address":5589932}},"MAP_SEAFLOOR_CAVERN_ROOM8":{"fishing_encounters":null,"header_rom_address":4747708,"land_encounters":{"encounter_slots":[41,41,41,41,41,41,41,41,42,42,42,42],"rom_address":5590008},"warp_table_rom_address":5475196,"water_encounters":null},"MAP_SEAFLOOR_CAVERN_ROOM9":{"fishing_encounters":null,"header_rom_address":4747736,"land_encounters":null,"warp_table_rom_address":5475400,"water_encounters":null},"MAP_SEALED_CHAMBER_INNER_ROOM":{"fishing_encounters":null,"header_rom_address":4748744,"land_encounters":null,"warp_table_rom_address":5480024,"water_encounters":null},"MAP_SEALED_CHAMBER_OUTER_ROOM":{"fishing_encounters":null,"header_rom_address":4748716,"land_encounters":null,"warp_table_rom_address":5479648,"water_encounters":null},"MAP_SECRET_BASE_BLUE_CAVE1":{"fishing_encounters":null,"header_rom_address":4749808,"land_encounters":null,"warp_table_rom_address":5483692,"water_encounters":null},"MAP_SECRET_BASE_BLUE_CAVE2":{"fishing_encounters":null,"header_rom_address":4749976,"land_encounters":null,"warp_table_rom_address":5486020,"water_encounters":null},"MAP_SECRET_BASE_BLUE_CAVE3":{"fishing_encounters":null,"header_rom_address":4750144,"land_encounters":null,"warp_table_rom_address":5488348,"water_encounters":null},"MAP_SECRET_BASE_BLUE_CAVE4":{"fishing_encounters":null,"header_rom_address":4750312,"land_encounters":null,"warp_table_rom_address":5490676,"water_encounters":null},"MAP_SECRET_BASE_BROWN_CAVE1":{"fishing_encounters":null,"header_rom_address":4749780,"land_encounters":null,"warp_table_rom_address":5483304,"water_encounters":null},"MAP_SECRET_BASE_BROWN_CAVE2":{"fishing_encounters":null,"header_rom_address":4749948,"land_encounters":null,"warp_table_rom_address":5485632,"water_encounters":null},"MAP_SECRET_BASE_BROWN_CAVE3":{"fishing_encounters":null,"header_rom_address":4750116,"land_encounters":null,"warp_table_rom_address":5487960,"water_encounters":null},"MAP_SECRET_BASE_BROWN_CAVE4":{"fishing_encounters":null,"header_rom_address":4750284,"land_encounters":null,"warp_table_rom_address":5490288,"water_encounters":null},"MAP_SECRET_BASE_RED_CAVE1":{"fishing_encounters":null,"header_rom_address":4749752,"land_encounters":null,"warp_table_rom_address":5482916,"water_encounters":null},"MAP_SECRET_BASE_RED_CAVE2":{"fishing_encounters":null,"header_rom_address":4749920,"land_encounters":null,"warp_table_rom_address":5485244,"water_encounters":null},"MAP_SECRET_BASE_RED_CAVE3":{"fishing_encounters":null,"header_rom_address":4750088,"land_encounters":null,"warp_table_rom_address":5487572,"water_encounters":null},"MAP_SECRET_BASE_RED_CAVE4":{"fishing_encounters":null,"header_rom_address":4750256,"land_encounters":null,"warp_table_rom_address":5489900,"water_encounters":null},"MAP_SECRET_BASE_SHRUB1":{"fishing_encounters":null,"header_rom_address":4749892,"land_encounters":null,"warp_table_rom_address":5484856,"water_encounters":null},"MAP_SECRET_BASE_SHRUB2":{"fishing_encounters":null,"header_rom_address":4750060,"land_encounters":null,"warp_table_rom_address":5487184,"water_encounters":null},"MAP_SECRET_BASE_SHRUB3":{"fishing_encounters":null,"header_rom_address":4750228,"land_encounters":null,"warp_table_rom_address":5489512,"water_encounters":null},"MAP_SECRET_BASE_SHRUB4":{"fishing_encounters":null,"header_rom_address":4750396,"land_encounters":null,"warp_table_rom_address":5491840,"water_encounters":null},"MAP_SECRET_BASE_TREE1":{"fishing_encounters":null,"header_rom_address":4749864,"land_encounters":null,"warp_table_rom_address":5484468,"water_encounters":null},"MAP_SECRET_BASE_TREE2":{"fishing_encounters":null,"header_rom_address":4750032,"land_encounters":null,"warp_table_rom_address":5486796,"water_encounters":null},"MAP_SECRET_BASE_TREE3":{"fishing_encounters":null,"header_rom_address":4750200,"land_encounters":null,"warp_table_rom_address":5489124,"water_encounters":null},"MAP_SECRET_BASE_TREE4":{"fishing_encounters":null,"header_rom_address":4750368,"land_encounters":null,"warp_table_rom_address":5491452,"water_encounters":null},"MAP_SECRET_BASE_YELLOW_CAVE1":{"fishing_encounters":null,"header_rom_address":4749836,"land_encounters":null,"warp_table_rom_address":5484080,"water_encounters":null},"MAP_SECRET_BASE_YELLOW_CAVE2":{"fishing_encounters":null,"header_rom_address":4750004,"land_encounters":null,"warp_table_rom_address":5486408,"water_encounters":null},"MAP_SECRET_BASE_YELLOW_CAVE3":{"fishing_encounters":null,"header_rom_address":4750172,"land_encounters":null,"warp_table_rom_address":5488736,"water_encounters":null},"MAP_SECRET_BASE_YELLOW_CAVE4":{"fishing_encounters":null,"header_rom_address":4750340,"land_encounters":null,"warp_table_rom_address":5491064,"water_encounters":null},"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":{"fishing_encounters":null,"header_rom_address":4748128,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":{"fishing_encounters":null,"header_rom_address":4748156,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5591764},"header_rom_address":4748016,"land_encounters":{"encounter_slots":[41,341,41,341,41,341,41,341,42,341,42,341],"rom_address":5591680},"warp_table_rom_address":5476868,"water_encounters":{"encounter_slots":[72,41,341,341,341],"rom_address":5591736}},"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":{"fishing_encounters":null,"header_rom_address":4749052,"land_encounters":{"encounter_slots":[41,341,41,341,41,341,346,341,42,346,42,346],"rom_address":5592372},"warp_table_rom_address":5480584,"water_encounters":null},"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5591632},"header_rom_address":4748044,"land_encounters":{"encounter_slots":[41,341,41,341,41,341,41,341,42,341,42,341],"rom_address":5591548},"warp_table_rom_address":5476944,"water_encounters":{"encounter_slots":[72,41,341,341,341],"rom_address":5591604}},"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":{"fishing_encounters":null,"header_rom_address":4748100,"land_encounters":{"encounter_slots":[41,341,41,341,41,341,41,341,42,341,42,341],"rom_address":5591492},"warp_table_rom_address":5477220,"water_encounters":null},"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":{"fishing_encounters":null,"header_rom_address":4748072,"land_encounters":{"encounter_slots":[41,341,41,341,41,341,41,341,42,341,42,341],"rom_address":5591436},"warp_table_rom_address":5477124,"water_encounters":null},"MAP_SKY_PILLAR_1F":{"fishing_encounters":null,"header_rom_address":4748940,"land_encounters":{"encounter_slots":[322,42,42,322,319,378,378,319,319,319,319,319],"rom_address":5592428},"warp_table_rom_address":5480368,"water_encounters":null},"MAP_SKY_PILLAR_2F":{"fishing_encounters":null,"header_rom_address":4748968,"land_encounters":null,"warp_table_rom_address":5480412,"water_encounters":null},"MAP_SKY_PILLAR_3F":{"fishing_encounters":null,"header_rom_address":4748996,"land_encounters":{"encounter_slots":[322,42,42,322,319,378,378,319,319,319,319,319],"rom_address":5592560},"warp_table_rom_address":5480448,"water_encounters":null},"MAP_SKY_PILLAR_4F":{"fishing_encounters":null,"header_rom_address":4749024,"land_encounters":null,"warp_table_rom_address":5480492,"water_encounters":null},"MAP_SKY_PILLAR_5F":{"fishing_encounters":null,"header_rom_address":4749080,"land_encounters":{"encounter_slots":[322,42,42,322,319,378,378,319,319,359,359,359],"rom_address":5592616},"warp_table_rom_address":5480612,"water_encounters":null},"MAP_SKY_PILLAR_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4748884,"land_encounters":null,"warp_table_rom_address":5480272,"water_encounters":null},"MAP_SKY_PILLAR_OUTSIDE":{"fishing_encounters":null,"header_rom_address":4748912,"land_encounters":null,"warp_table_rom_address":5480332,"water_encounters":null},"MAP_SKY_PILLAR_TOP":{"fishing_encounters":null,"header_rom_address":4749108,"land_encounters":null,"warp_table_rom_address":5480696,"water_encounters":null},"MAP_SLATEPORT_CITY":{"fishing_encounters":{"encounter_slots":[129,72,129,72,313,313,313,313,313,313],"rom_address":5591992},"header_rom_address":4740092,"land_encounters":null,"warp_table_rom_address":5411900,"water_encounters":{"encounter_slots":[72,309,309,310,310],"rom_address":5591964}},"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":{"fishing_encounters":null,"header_rom_address":4743284,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":{"fishing_encounters":null,"header_rom_address":4743256,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":{"fishing_encounters":null,"header_rom_address":4743228,"land_encounters":null,"warp_table_rom_address":5448664,"water_encounters":null},"MAP_SLATEPORT_CITY_HARBOR":{"fishing_encounters":null,"header_rom_address":4743424,"land_encounters":null,"warp_table_rom_address":5450368,"water_encounters":null},"MAP_SLATEPORT_CITY_HOUSE":{"fishing_encounters":null,"header_rom_address":4743452,"land_encounters":null,"warp_table_rom_address":5450532,"water_encounters":null},"MAP_SLATEPORT_CITY_MART":{"fishing_encounters":null,"header_rom_address":4743536,"land_encounters":null,"warp_table_rom_address":5450896,"water_encounters":null},"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":{"fishing_encounters":null,"header_rom_address":4743312,"land_encounters":null,"warp_table_rom_address":5448872,"water_encounters":null},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":{"fishing_encounters":null,"header_rom_address":4743368,"land_encounters":null,"warp_table_rom_address":5449496,"water_encounters":null},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":{"fishing_encounters":null,"header_rom_address":4743396,"land_encounters":null,"warp_table_rom_address":5449896,"water_encounters":null},"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4743480,"land_encounters":null,"warp_table_rom_address":5450640,"water_encounters":null},"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4743508,"land_encounters":null,"warp_table_rom_address":5450780,"water_encounters":null},"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":{"fishing_encounters":null,"header_rom_address":4743340,"land_encounters":null,"warp_table_rom_address":5449124,"water_encounters":null},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":{"fishing_encounters":null,"header_rom_address":4743172,"land_encounters":null,"warp_table_rom_address":5448400,"water_encounters":null},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":{"fishing_encounters":null,"header_rom_address":4743200,"land_encounters":null,"warp_table_rom_address":5448516,"water_encounters":null},"MAP_SOOTOPOLIS_CITY":{"fishing_encounters":{"encounter_slots":[129,72,129,129,129,129,129,130,130,130],"rom_address":5592512},"header_rom_address":4740260,"land_encounters":null,"warp_table_rom_address":5415916,"water_encounters":{"encounter_slots":[129,129,129,129,129],"rom_address":5592484}},"MAP_SOOTOPOLIS_CITY_GYM_1F":{"fishing_encounters":null,"header_rom_address":4745552,"land_encounters":null,"warp_table_rom_address":5463932,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_GYM_B1F":{"fishing_encounters":null,"header_rom_address":4745580,"land_encounters":null,"warp_table_rom_address":5464240,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_HOUSE1":{"fishing_encounters":null,"header_rom_address":4745692,"land_encounters":null,"warp_table_rom_address":5464704,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_HOUSE2":{"fishing_encounters":null,"header_rom_address":4745720,"land_encounters":null,"warp_table_rom_address":5464764,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_HOUSE3":{"fishing_encounters":null,"header_rom_address":4745748,"land_encounters":null,"warp_table_rom_address":5464848,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_HOUSE4":{"fishing_encounters":null,"header_rom_address":4745776,"land_encounters":null,"warp_table_rom_address":5464956,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_HOUSE5":{"fishing_encounters":null,"header_rom_address":4745804,"land_encounters":null,"warp_table_rom_address":5465040,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_HOUSE6":{"fishing_encounters":null,"header_rom_address":4745832,"land_encounters":null,"warp_table_rom_address":5465100,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_HOUSE7":{"fishing_encounters":null,"header_rom_address":4745860,"land_encounters":null,"warp_table_rom_address":5465184,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":{"fishing_encounters":null,"header_rom_address":4745888,"land_encounters":null,"warp_table_rom_address":5465268,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_MART":{"fishing_encounters":null,"header_rom_address":4745664,"land_encounters":null,"warp_table_rom_address":5464620,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":{"fishing_encounters":null,"header_rom_address":4745916,"land_encounters":null,"warp_table_rom_address":5465352,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":{"fishing_encounters":null,"header_rom_address":4745944,"land_encounters":null,"warp_table_rom_address":5465420,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4745608,"land_encounters":null,"warp_table_rom_address":5464364,"water_encounters":null},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4745636,"land_encounters":null,"warp_table_rom_address":5464504,"water_encounters":null},"MAP_SOUTHERN_ISLAND_EXTERIOR":{"fishing_encounters":null,"header_rom_address":4751712,"land_encounters":null,"warp_table_rom_address":5498820,"water_encounters":null},"MAP_SOUTHERN_ISLAND_INTERIOR":{"fishing_encounters":null,"header_rom_address":4751740,"land_encounters":null,"warp_table_rom_address":5498916,"water_encounters":null},"MAP_SS_TIDAL_CORRIDOR":{"fishing_encounters":null,"header_rom_address":4750900,"land_encounters":null,"warp_table_rom_address":5493032,"water_encounters":null},"MAP_SS_TIDAL_LOWER_DECK":{"fishing_encounters":null,"header_rom_address":4750928,"land_encounters":null,"warp_table_rom_address":5493316,"water_encounters":null},"MAP_SS_TIDAL_ROOMS":{"fishing_encounters":null,"header_rom_address":4750956,"land_encounters":null,"warp_table_rom_address":5493548,"water_encounters":null},"MAP_TERRA_CAVE_END":{"fishing_encounters":null,"header_rom_address":4749668,"land_encounters":null,"warp_table_rom_address":5482432,"water_encounters":null},"MAP_TERRA_CAVE_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4749640,"land_encounters":null,"warp_table_rom_address":5482372,"water_encounters":null},"MAP_TRADE_CENTER":{"fishing_encounters":null,"header_rom_address":4750452,"land_encounters":null,"warp_table_rom_address":5491984,"water_encounters":null},"MAP_TRAINER_HILL_1F":{"fishing_encounters":null,"header_rom_address":4753168,"land_encounters":null,"warp_table_rom_address":5507212,"water_encounters":null},"MAP_TRAINER_HILL_2F":{"fishing_encounters":null,"header_rom_address":4753196,"land_encounters":null,"warp_table_rom_address":5507248,"water_encounters":null},"MAP_TRAINER_HILL_3F":{"fishing_encounters":null,"header_rom_address":4753224,"land_encounters":null,"warp_table_rom_address":5507284,"water_encounters":null},"MAP_TRAINER_HILL_4F":{"fishing_encounters":null,"header_rom_address":4753252,"land_encounters":null,"warp_table_rom_address":5507320,"water_encounters":null},"MAP_TRAINER_HILL_ELEVATOR":{"fishing_encounters":null,"header_rom_address":4753924,"land_encounters":null,"warp_table_rom_address":5508340,"water_encounters":null},"MAP_TRAINER_HILL_ENTRANCE":{"fishing_encounters":null,"header_rom_address":4753140,"land_encounters":null,"warp_table_rom_address":5507140,"water_encounters":null},"MAP_TRAINER_HILL_ROOF":{"fishing_encounters":null,"header_rom_address":4753280,"land_encounters":null,"warp_table_rom_address":5507380,"water_encounters":null},"MAP_UNDERWATER_MARINE_CAVE":{"fishing_encounters":null,"header_rom_address":4749556,"land_encounters":null,"warp_table_rom_address":5482248,"water_encounters":null},"MAP_UNDERWATER_ROUTE105":{"fishing_encounters":null,"header_rom_address":4741604,"land_encounters":null,"warp_table_rom_address":5439388,"water_encounters":null},"MAP_UNDERWATER_ROUTE124":{"fishing_encounters":null,"header_rom_address":4741464,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":{"encounter_slots":[373,170,373,381,381],"rom_address":5592344}},"MAP_UNDERWATER_ROUTE125":{"fishing_encounters":null,"header_rom_address":4741632,"land_encounters":null,"warp_table_rom_address":5439424,"water_encounters":null},"MAP_UNDERWATER_ROUTE126":{"fishing_encounters":null,"header_rom_address":4741492,"land_encounters":null,"warp_table_rom_address":5439092,"water_encounters":{"encounter_slots":[373,170,373,381,381],"rom_address":5586596}},"MAP_UNDERWATER_ROUTE127":{"fishing_encounters":null,"header_rom_address":4741520,"land_encounters":null,"warp_table_rom_address":5439216,"water_encounters":null},"MAP_UNDERWATER_ROUTE128":{"fishing_encounters":null,"header_rom_address":4741548,"land_encounters":null,"warp_table_rom_address":5439300,"water_encounters":null},"MAP_UNDERWATER_ROUTE129":{"fishing_encounters":null,"header_rom_address":4741576,"land_encounters":null,"warp_table_rom_address":5439352,"water_encounters":null},"MAP_UNDERWATER_ROUTE134":{"fishing_encounters":null,"header_rom_address":4748660,"land_encounters":null,"warp_table_rom_address":5479580,"water_encounters":null},"MAP_UNDERWATER_SEAFLOOR_CAVERN":{"fishing_encounters":null,"header_rom_address":4747456,"land_encounters":null,"warp_table_rom_address":5473784,"water_encounters":null},"MAP_UNDERWATER_SEALED_CHAMBER":{"fishing_encounters":null,"header_rom_address":4748688,"land_encounters":null,"warp_table_rom_address":5479608,"water_encounters":null},"MAP_UNDERWATER_SOOTOPOLIS_CITY":{"fishing_encounters":null,"header_rom_address":4746868,"land_encounters":null,"warp_table_rom_address":5468808,"water_encounters":null},"MAP_UNION_ROOM":{"fishing_encounters":null,"header_rom_address":4751432,"land_encounters":null,"warp_table_rom_address":5496912,"water_encounters":null},"MAP_UNUSED_CONTEST_HALL1":{"fishing_encounters":null,"header_rom_address":4750564,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_UNUSED_CONTEST_HALL2":{"fishing_encounters":null,"header_rom_address":4750592,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_UNUSED_CONTEST_HALL3":{"fishing_encounters":null,"header_rom_address":4750620,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_UNUSED_CONTEST_HALL4":{"fishing_encounters":null,"header_rom_address":4750648,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_UNUSED_CONTEST_HALL5":{"fishing_encounters":null,"header_rom_address":4750676,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_UNUSED_CONTEST_HALL6":{"fishing_encounters":null,"header_rom_address":4750704,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_VERDANTURF_TOWN":{"fishing_encounters":null,"header_rom_address":4740456,"land_encounters":null,"warp_table_rom_address":5418084,"water_encounters":null},"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":{"fishing_encounters":null,"header_rom_address":4742584,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":{"fishing_encounters":null,"header_rom_address":4742556,"land_encounters":null,"warp_table_rom_address":4160749568,"water_encounters":null},"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":{"fishing_encounters":null,"header_rom_address":4742528,"land_encounters":null,"warp_table_rom_address":5445168,"water_encounters":null},"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":{"fishing_encounters":null,"header_rom_address":4742724,"land_encounters":null,"warp_table_rom_address":5445968,"water_encounters":null},"MAP_VERDANTURF_TOWN_HOUSE":{"fishing_encounters":null,"header_rom_address":4742752,"land_encounters":null,"warp_table_rom_address":5446052,"water_encounters":null},"MAP_VERDANTURF_TOWN_MART":{"fishing_encounters":null,"header_rom_address":4742612,"land_encounters":null,"warp_table_rom_address":5445448,"water_encounters":null},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":{"fishing_encounters":null,"header_rom_address":4742640,"land_encounters":null,"warp_table_rom_address":5445580,"water_encounters":null},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":{"fishing_encounters":null,"header_rom_address":4742668,"land_encounters":null,"warp_table_rom_address":5445720,"water_encounters":null},"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":{"fishing_encounters":null,"header_rom_address":4742696,"land_encounters":null,"warp_table_rom_address":5445884,"water_encounters":null},"MAP_VICTORY_ROAD_1F":{"fishing_encounters":null,"header_rom_address":4747932,"land_encounters":{"encounter_slots":[42,336,383,371,41,335,42,336,382,370,382,370],"rom_address":5586484},"warp_table_rom_address":5475892,"water_encounters":null},"MAP_VICTORY_ROAD_B1F":{"fishing_encounters":null,"header_rom_address":4747960,"land_encounters":{"encounter_slots":[42,336,383,383,42,336,42,336,383,355,383,355],"rom_address":5590824},"warp_table_rom_address":5476500,"water_encounters":null},"MAP_VICTORY_ROAD_B2F":{"fishing_encounters":{"encounter_slots":[129,118,129,118,323,323,323,324,324,324],"rom_address":5590992},"header_rom_address":4747988,"land_encounters":{"encounter_slots":[42,322,383,383,42,322,42,322,383,355,383,355],"rom_address":5590908},"warp_table_rom_address":5476744,"water_encounters":{"encounter_slots":[42,42,42,42,42],"rom_address":5590964}}},"misc_ram_addresses":{"CB2_Overworld":134766684,"gArchipelagoReceivedItem":33792044,"gMain":50340544,"gSaveBlock1Ptr":50355596},"misc_rom_addresses":{"gArchipelagoInfo":5874864,"gArchipelagoOptions":5874840,"gEvolutionTable":3310148,"gLevelUpLearnsets":3326628,"gSpeciesInfo":3288488,"gTMHMLearnsets":3281524,"gTrainers":3221820,"sNewGamePCItems":6172396,"sStarterMon":5983704,"sTMHMMoves":6393984},"species":[{"abilities":[0,0],"base_stats":[0,0,0,0,0,0],"catch_rate":0,"evolutions":[],"friendship":0,"id":0,"learnset":{"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}],"rom_address":3300024},"rom_address":3288488,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"base_stats":[45,49,49,45,65,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":2}],"friendship":70,"id":1,"learnset":{"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}],"rom_address":3300024},"rom_address":3288516,"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"base_stats":[60,62,63,60,80,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":3}],"friendship":70,"id":2,"learnset":{"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}],"rom_address":3300052},"rom_address":3288544,"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"base_stats":[80,82,83,80,100,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":3,"learnset":{"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}],"rom_address":3300082},"rom_address":3288572,"tmhm_learnset":"00E41E0886354730","types":[12,3]},{"abilities":[66,0],"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":5}],"friendship":70,"id":4,"learnset":{"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}],"rom_address":3300112},"rom_address":3288600,"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":6}],"friendship":70,"id":5,"learnset":{"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}],"rom_address":3300138},"rom_address":3288628,"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":6,"learnset":{"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}],"rom_address":3300164},"rom_address":3288656,"tmhm_learnset":"00AE5EA4CE514633","types":[10,2]},{"abilities":[67,0],"base_stats":[44,48,65,43,50,64],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":8}],"friendship":70,"id":7,"learnset":{"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}],"rom_address":3300192},"rom_address":3288684,"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"base_stats":[59,63,80,58,65,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":9}],"friendship":70,"id":8,"learnset":{"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}],"rom_address":3300222},"rom_address":3288712,"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"base_stats":[79,83,100,78,85,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":9,"learnset":{"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}],"rom_address":3300252},"rom_address":3288740,"tmhm_learnset":"03B01E00CE537275","types":[11,11]},{"abilities":[19,0],"base_stats":[45,30,35,45,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":11}],"friendship":70,"id":10,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81}],"rom_address":3300282},"rom_address":3288768,"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"base_stats":[50,20,55,30,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":12}],"friendship":70,"id":11,"learnset":{"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}],"rom_address":3300292},"rom_address":3288796,"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[14,0],"base_stats":[60,45,50,70,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":12,"learnset":{"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}],"rom_address":3300304},"rom_address":3288824,"tmhm_learnset":"0040BE80B43F4620","types":[6,2]},{"abilities":[19,0],"base_stats":[40,35,30,50,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":14}],"friendship":70,"id":13,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81}],"rom_address":3300334},"rom_address":3288852,"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[61,0],"base_stats":[45,25,50,35,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":15}],"friendship":70,"id":14,"learnset":{"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}],"rom_address":3300344},"rom_address":3288880,"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[68,0],"base_stats":[65,80,40,75,45,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":15,"learnset":{"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}],"rom_address":3300356},"rom_address":3288908,"tmhm_learnset":"00843E88C4354620","types":[6,3]},{"abilities":[51,0],"base_stats":[40,45,40,56,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":17}],"friendship":70,"id":16,"learnset":{"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}],"rom_address":3300382},"rom_address":3288936,"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"base_stats":[63,60,55,71,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":18}],"friendship":70,"id":17,"learnset":{"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}],"rom_address":3300408},"rom_address":3288964,"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"base_stats":[83,80,75,91,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":18,"learnset":{"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}],"rom_address":3300434},"rom_address":3288992,"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[50,62],"base_stats":[30,56,35,72,25,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":20}],"friendship":70,"id":19,"learnset":{"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}],"rom_address":3300460},"rom_address":3289020,"tmhm_learnset":"00843E02ADD33E20","types":[0,0]},{"abilities":[50,62],"base_stats":[55,81,60,97,50,70],"catch_rate":127,"evolutions":[],"friendship":70,"id":20,"learnset":{"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}],"rom_address":3300482},"rom_address":3289048,"tmhm_learnset":"00A43E02ADD37E30","types":[0,0]},{"abilities":[51,0],"base_stats":[40,60,30,70,31,31],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":22}],"friendship":70,"id":21,"learnset":{"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}],"rom_address":3300504},"rom_address":3289076,"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"base_stats":[65,90,65,100,61,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":22,"learnset":{"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}],"rom_address":3300528},"rom_address":3289104,"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[22,61],"base_stats":[35,60,44,55,40,54],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":24}],"friendship":70,"id":23,"learnset":{"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}],"rom_address":3300550},"rom_address":3289132,"tmhm_learnset":"00213F088E570620","types":[3,3]},{"abilities":[22,61],"base_stats":[60,85,69,80,65,79],"catch_rate":90,"evolutions":[],"friendship":70,"id":24,"learnset":{"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}],"rom_address":3300578},"rom_address":3289160,"tmhm_learnset":"00213F088E574620","types":[3,3]},{"abilities":[9,0],"base_stats":[35,55,30,90,50,40],"catch_rate":190,"evolutions":[{"method":"ITEM","param":96,"species":26}],"friendship":70,"id":25,"learnset":{"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}],"rom_address":3300606},"rom_address":3289188,"tmhm_learnset":"00E01E02CDD38221","types":[13,13]},{"abilities":[9,0],"base_stats":[60,90,55,100,90,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":26,"learnset":{"moves":[{"level":1,"move_id":84},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":1,"move_id":85}],"rom_address":3300634},"rom_address":3289216,"tmhm_learnset":"00E03E02CDD3C221","types":[13,13]},{"abilities":[8,0],"base_stats":[50,75,85,40,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":28}],"friendship":70,"id":27,"learnset":{"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}],"rom_address":3300644},"rom_address":3289244,"tmhm_learnset":"00A43ED0CE510621","types":[4,4]},{"abilities":[8,0],"base_stats":[75,100,110,65,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":28,"learnset":{"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}],"rom_address":3300670},"rom_address":3289272,"tmhm_learnset":"00A43ED0CE514621","types":[4,4]},{"abilities":[38,0],"base_stats":[55,47,52,41,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":30}],"friendship":70,"id":29,"learnset":{"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}],"rom_address":3300696},"rom_address":3289300,"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"base_stats":[70,62,67,56,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":31}],"friendship":70,"id":30,"learnset":{"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}],"rom_address":3300722},"rom_address":3289328,"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"base_stats":[90,82,87,76,75,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":31,"learnset":{"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}],"rom_address":3300748},"rom_address":3289356,"tmhm_learnset":"00B43FFEEFD37E35","types":[3,4]},{"abilities":[38,0],"base_stats":[46,57,40,50,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":33}],"friendship":70,"id":32,"learnset":{"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}],"rom_address":3300760},"rom_address":3289384,"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"base_stats":[61,72,57,65,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":34}],"friendship":70,"id":33,"learnset":{"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}],"rom_address":3300786},"rom_address":3289412,"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"base_stats":[81,92,77,85,85,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":34,"learnset":{"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}],"rom_address":3300812},"rom_address":3289440,"tmhm_learnset":"00B43F7EEFD37E35","types":[3,4]},{"abilities":[56,0],"base_stats":[70,45,48,35,60,65],"catch_rate":150,"evolutions":[{"method":"ITEM","param":94,"species":36}],"friendship":140,"id":35,"learnset":{"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}],"rom_address":3300824},"rom_address":3289468,"tmhm_learnset":"00611E27FDFBB62D","types":[0,0]},{"abilities":[56,0],"base_stats":[95,70,73,60,85,90],"catch_rate":25,"evolutions":[],"friendship":140,"id":36,"learnset":{"moves":[{"level":1,"move_id":47},{"level":1,"move_id":3},{"level":1,"move_id":107},{"level":1,"move_id":118}],"rom_address":3300856},"rom_address":3289496,"tmhm_learnset":"00611E27FDFBF62D","types":[0,0]},{"abilities":[18,0],"base_stats":[38,41,40,65,50,65],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":38}],"friendship":70,"id":37,"learnset":{"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}],"rom_address":3300866},"rom_address":3289524,"tmhm_learnset":"00021E248C590630","types":[10,10]},{"abilities":[18,0],"base_stats":[73,76,75,100,81,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":38,"learnset":{"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}],"rom_address":3300896},"rom_address":3289552,"tmhm_learnset":"00021E248C594630","types":[10,10]},{"abilities":[56,0],"base_stats":[115,45,20,20,45,25],"catch_rate":170,"evolutions":[{"method":"ITEM","param":94,"species":40}],"friendship":70,"id":39,"learnset":{"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}],"rom_address":3300908},"rom_address":3289580,"tmhm_learnset":"00611E27FDBBB625","types":[0,0]},{"abilities":[56,0],"base_stats":[140,70,45,45,75,50],"catch_rate":50,"evolutions":[],"friendship":70,"id":40,"learnset":{"moves":[{"level":1,"move_id":47},{"level":1,"move_id":50},{"level":1,"move_id":111},{"level":1,"move_id":3}],"rom_address":3300938},"rom_address":3289608,"tmhm_learnset":"00611E27FDBBF625","types":[0,0]},{"abilities":[39,0],"base_stats":[40,45,35,55,30,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":42}],"friendship":70,"id":41,"learnset":{"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}],"rom_address":3300948},"rom_address":3289636,"tmhm_learnset":"00017F88A4170E20","types":[3,2]},{"abilities":[39,0],"base_stats":[75,80,70,90,65,75],"catch_rate":90,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":169}],"friendship":70,"id":42,"learnset":{"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}],"rom_address":3300976},"rom_address":3289664,"tmhm_learnset":"00017F88A4174E20","types":[3,2]},{"abilities":[34,0],"base_stats":[45,50,55,30,75,65],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":44}],"friendship":70,"id":43,"learnset":{"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}],"rom_address":3301004},"rom_address":3289692,"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"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":{"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}],"rom_address":3301028},"rom_address":3289720,"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"base_stats":[75,80,85,50,100,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":45,"learnset":{"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}],"rom_address":3301052},"rom_address":3289748,"tmhm_learnset":"00441E0884354720","types":[12,3]},{"abilities":[27,0],"base_stats":[35,70,55,25,45,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":24,"species":47}],"friendship":70,"id":46,"learnset":{"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}],"rom_address":3301064},"rom_address":3289776,"tmhm_learnset":"00C43E888C350720","types":[6,12]},{"abilities":[27,0],"base_stats":[60,95,80,30,60,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":47,"learnset":{"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}],"rom_address":3301090},"rom_address":3289804,"tmhm_learnset":"00C43E888C354720","types":[6,12]},{"abilities":[14,0],"base_stats":[60,55,50,45,40,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":49}],"friendship":70,"id":48,"learnset":{"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}],"rom_address":3301116},"rom_address":3289832,"tmhm_learnset":"0040BE0894350620","types":[6,3]},{"abilities":[19,0],"base_stats":[70,65,60,90,90,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":49,"learnset":{"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}],"rom_address":3301142},"rom_address":3289860,"tmhm_learnset":"0040BE8894354620","types":[6,3]},{"abilities":[8,71],"base_stats":[10,55,25,95,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":26,"species":51}],"friendship":70,"id":50,"learnset":{"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}],"rom_address":3301172},"rom_address":3289888,"tmhm_learnset":"00843EC88E110620","types":[4,4]},{"abilities":[8,71],"base_stats":[35,80,50,120,50,70],"catch_rate":50,"evolutions":[],"friendship":70,"id":51,"learnset":{"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}],"rom_address":3301196},"rom_address":3289916,"tmhm_learnset":"00843EC88E114620","types":[4,4]},{"abilities":[53,0],"base_stats":[40,45,35,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":28,"species":53}],"friendship":70,"id":52,"learnset":{"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}],"rom_address":3301222},"rom_address":3289944,"tmhm_learnset":"00453F82ADD30E24","types":[0,0]},{"abilities":[7,0],"base_stats":[65,70,60,115,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":53,"learnset":{"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}],"rom_address":3301246},"rom_address":3289972,"tmhm_learnset":"00453F82ADD34E34","types":[0,0]},{"abilities":[6,13],"base_stats":[50,52,48,55,65,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":33,"species":55}],"friendship":70,"id":54,"learnset":{"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}],"rom_address":3301270},"rom_address":3290000,"tmhm_learnset":"03F01E80CC53326D","types":[11,11]},{"abilities":[6,13],"base_stats":[80,82,78,85,95,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":55,"learnset":{"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}],"rom_address":3301294},"rom_address":3290028,"tmhm_learnset":"03F01E80CC53726D","types":[11,11]},{"abilities":[72,0],"base_stats":[40,80,35,70,35,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":57}],"friendship":70,"id":56,"learnset":{"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}],"rom_address":3301318},"rom_address":3290056,"tmhm_learnset":"00A23EC0CFD30EA1","types":[1,1]},{"abilities":[72,0],"base_stats":[65,105,60,95,60,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":57,"learnset":{"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}],"rom_address":3301344},"rom_address":3290084,"tmhm_learnset":"00A23EC0CFD34EA1","types":[1,1]},{"abilities":[22,18],"base_stats":[55,70,45,60,70,50],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":59}],"friendship":70,"id":58,"learnset":{"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}],"rom_address":3301372},"rom_address":3290112,"tmhm_learnset":"00A23EA48C510630","types":[10,10]},{"abilities":[22,18],"base_stats":[90,110,80,95,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":59,"learnset":{"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}],"rom_address":3301398},"rom_address":3290140,"tmhm_learnset":"00A23EA48C514630","types":[10,10]},{"abilities":[11,6],"base_stats":[40,50,40,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":61}],"friendship":70,"id":60,"learnset":{"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}],"rom_address":3301410},"rom_address":3290168,"tmhm_learnset":"03103E009C133264","types":[11,11]},{"abilities":[11,6],"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":{"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}],"rom_address":3301434},"rom_address":3290196,"tmhm_learnset":"03B03E00DE133265","types":[11,11]},{"abilities":[11,6],"base_stats":[90,85,95,70,70,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":62,"learnset":{"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}],"rom_address":3301458},"rom_address":3290224,"tmhm_learnset":"03B03E40DE1372E5","types":[11,1]},{"abilities":[28,39],"base_stats":[25,20,15,90,105,55],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":16,"species":64}],"friendship":70,"id":63,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":100}],"rom_address":3301472},"rom_address":3290252,"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"base_stats":[40,35,30,105,120,70],"catch_rate":100,"evolutions":[{"method":"LEVEL","param":37,"species":65}],"friendship":70,"id":64,"learnset":{"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}],"rom_address":3301482},"rom_address":3290280,"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"base_stats":[55,50,45,120,135,85],"catch_rate":50,"evolutions":[],"friendship":70,"id":65,"learnset":{"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}],"rom_address":3301510},"rom_address":3290308,"tmhm_learnset":"0041BF03B45BCE29","types":[14,14]},{"abilities":[62,0],"base_stats":[70,80,50,35,35,35],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":28,"species":67}],"friendship":70,"id":66,"learnset":{"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}],"rom_address":3301538},"rom_address":3290336,"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"base_stats":[80,100,70,45,50,60],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":68}],"friendship":70,"id":67,"learnset":{"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}],"rom_address":3301568},"rom_address":3290364,"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"base_stats":[90,130,80,55,65,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":68,"learnset":{"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}],"rom_address":3301598},"rom_address":3290392,"tmhm_learnset":"00A03E64CE1346A1","types":[1,1]},{"abilities":[34,0],"base_stats":[50,75,35,40,70,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":70}],"friendship":70,"id":69,"learnset":{"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}],"rom_address":3301628},"rom_address":3290420,"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"base_stats":[65,90,50,55,85,45],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":71}],"friendship":70,"id":70,"learnset":{"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}],"rom_address":3301656},"rom_address":3290448,"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"base_stats":[80,105,65,70,100,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":71,"learnset":{"moves":[{"level":1,"move_id":22},{"level":1,"move_id":79},{"level":1,"move_id":230},{"level":1,"move_id":75}],"rom_address":3301684},"rom_address":3290476,"tmhm_learnset":"00443E0884354720","types":[12,3]},{"abilities":[29,64],"base_stats":[40,40,35,70,50,100],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":73}],"friendship":70,"id":72,"learnset":{"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}],"rom_address":3301694},"rom_address":3290504,"tmhm_learnset":"03143E0884173264","types":[11,3]},{"abilities":[29,64],"base_stats":[80,70,65,100,80,120],"catch_rate":60,"evolutions":[],"friendship":70,"id":73,"learnset":{"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}],"rom_address":3301720},"rom_address":3290532,"tmhm_learnset":"03143E0884177264","types":[11,3]},{"abilities":[69,5],"base_stats":[40,80,100,20,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":75}],"friendship":70,"id":74,"learnset":{"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}],"rom_address":3301746},"rom_address":3290560,"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"base_stats":[55,95,115,35,45,45],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":37,"species":76}],"friendship":70,"id":75,"learnset":{"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}],"rom_address":3301774},"rom_address":3290588,"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"base_stats":[80,110,130,45,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":76,"learnset":{"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}],"rom_address":3301802},"rom_address":3290616,"tmhm_learnset":"00A01E74CE114631","types":[5,4]},{"abilities":[50,18],"base_stats":[50,85,55,90,65,65],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":40,"species":78}],"friendship":70,"id":77,"learnset":{"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}],"rom_address":3301830},"rom_address":3290644,"tmhm_learnset":"00221E2484710620","types":[10,10]},{"abilities":[50,18],"base_stats":[65,100,70,105,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":78,"learnset":{"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}],"rom_address":3301858},"rom_address":3290672,"tmhm_learnset":"00221E2484714620","types":[10,10]},{"abilities":[12,20],"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":{"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}],"rom_address":3301888},"rom_address":3290700,"tmhm_learnset":"02709E24BE5B366C","types":[11,14]},{"abilities":[12,20],"base_stats":[95,75,110,30,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":80,"learnset":{"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}],"rom_address":3301912},"rom_address":3290728,"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[42,5],"base_stats":[25,35,70,45,95,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":82}],"friendship":70,"id":81,"learnset":{"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}],"rom_address":3301938},"rom_address":3290756,"tmhm_learnset":"00400E0385930620","types":[13,8]},{"abilities":[42,5],"base_stats":[50,60,95,70,120,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":82,"learnset":{"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}],"rom_address":3301966},"rom_address":3290784,"tmhm_learnset":"00400E0385934620","types":[13,8]},{"abilities":[51,39],"base_stats":[52,65,55,60,58,62],"catch_rate":45,"evolutions":[],"friendship":70,"id":83,"learnset":{"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}],"rom_address":3301994},"rom_address":3290812,"tmhm_learnset":"000C7E8084510620","types":[0,2]},{"abilities":[50,48],"base_stats":[35,85,45,75,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":85}],"friendship":70,"id":84,"learnset":{"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}],"rom_address":3302022},"rom_address":3290840,"tmhm_learnset":"00087E8084110620","types":[0,2]},{"abilities":[50,48],"base_stats":[60,110,70,100,60,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":85,"learnset":{"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}],"rom_address":3302046},"rom_address":3290868,"tmhm_learnset":"00087F8084114E20","types":[0,2]},{"abilities":[47,0],"base_stats":[65,45,55,45,45,70],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":34,"species":87}],"friendship":70,"id":86,"learnset":{"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}],"rom_address":3302070},"rom_address":3290896,"tmhm_learnset":"03103E00841B3264","types":[11,11]},{"abilities":[47,0],"base_stats":[90,70,80,70,70,95],"catch_rate":75,"evolutions":[],"friendship":70,"id":87,"learnset":{"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}],"rom_address":3302094},"rom_address":3290924,"tmhm_learnset":"03103E00841B7264","types":[11,15]},{"abilities":[1,60],"base_stats":[80,80,50,25,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":89}],"friendship":70,"id":88,"learnset":{"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}],"rom_address":3302120},"rom_address":3290952,"tmhm_learnset":"00003F6E8D970E20","types":[3,3]},{"abilities":[1,60],"base_stats":[105,105,75,50,65,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":89,"learnset":{"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}],"rom_address":3302146},"rom_address":3290980,"tmhm_learnset":"00A03F6ECD974E21","types":[3,3]},{"abilities":[75,0],"base_stats":[30,65,100,40,45,25],"catch_rate":190,"evolutions":[{"method":"ITEM","param":97,"species":91}],"friendship":70,"id":90,"learnset":{"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}],"rom_address":3302172},"rom_address":3291008,"tmhm_learnset":"02101E0084133264","types":[11,11]},{"abilities":[75,0],"base_stats":[50,95,180,70,85,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":91,"learnset":{"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}],"rom_address":3302194},"rom_address":3291036,"tmhm_learnset":"02101F0084137264","types":[11,15]},{"abilities":[26,0],"base_stats":[30,35,30,80,100,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":93}],"friendship":70,"id":92,"learnset":{"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}],"rom_address":3302208},"rom_address":3291064,"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"base_stats":[45,50,45,95,115,55],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":94}],"friendship":70,"id":93,"learnset":{"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}],"rom_address":3302232},"rom_address":3291092,"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"base_stats":[60,65,60,110,130,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":94,"learnset":{"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}],"rom_address":3302258},"rom_address":3291120,"tmhm_learnset":"00A1BF08F5974E21","types":[7,3]},{"abilities":[69,5],"base_stats":[35,45,160,70,30,45],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":208}],"friendship":70,"id":95,"learnset":{"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}],"rom_address":3302284},"rom_address":3291148,"tmhm_learnset":"00A01F508E510E30","types":[5,4]},{"abilities":[15,0],"base_stats":[60,48,45,42,43,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":26,"species":97}],"friendship":70,"id":96,"learnset":{"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}],"rom_address":3302312},"rom_address":3291176,"tmhm_learnset":"0041BF01F41B8E29","types":[14,14]},{"abilities":[15,0],"base_stats":[85,73,70,67,73,115],"catch_rate":75,"evolutions":[],"friendship":70,"id":97,"learnset":{"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}],"rom_address":3302338},"rom_address":3291204,"tmhm_learnset":"0041BF01F41BCE29","types":[14,14]},{"abilities":[52,75],"base_stats":[30,105,90,50,25,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":28,"species":99}],"friendship":70,"id":98,"learnset":{"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}],"rom_address":3302364},"rom_address":3291232,"tmhm_learnset":"02B43E408C133264","types":[11,11]},{"abilities":[52,75],"base_stats":[55,130,115,75,50,50],"catch_rate":60,"evolutions":[],"friendship":70,"id":99,"learnset":{"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}],"rom_address":3302390},"rom_address":3291260,"tmhm_learnset":"02B43E408C137264","types":[11,11]},{"abilities":[43,9],"base_stats":[40,30,50,100,55,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":101}],"friendship":70,"id":100,"learnset":{"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}],"rom_address":3302416},"rom_address":3291288,"tmhm_learnset":"00402F0285938A20","types":[13,13]},{"abilities":[43,9],"base_stats":[60,50,70,140,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":101,"learnset":{"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}],"rom_address":3302444},"rom_address":3291316,"tmhm_learnset":"00402F028593CA20","types":[13,13]},{"abilities":[34,0],"base_stats":[60,40,80,40,60,45],"catch_rate":90,"evolutions":[{"method":"ITEM","param":98,"species":103}],"friendship":70,"id":102,"learnset":{"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}],"rom_address":3302472},"rom_address":3291344,"tmhm_learnset":"0060BE0994358720","types":[12,14]},{"abilities":[34,0],"base_stats":[95,95,85,55,125,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":103,"learnset":{"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}],"rom_address":3302496},"rom_address":3291372,"tmhm_learnset":"0060BE099435C720","types":[12,14]},{"abilities":[69,31],"base_stats":[50,50,95,35,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":105}],"friendship":70,"id":104,"learnset":{"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}],"rom_address":3302510},"rom_address":3291400,"tmhm_learnset":"00A03EF4CE513621","types":[4,4]},{"abilities":[69,31],"base_stats":[60,80,110,45,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":105,"learnset":{"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}],"rom_address":3302542},"rom_address":3291428,"tmhm_learnset":"00A03EF4CE517621","types":[4,4]},{"abilities":[7,0],"base_stats":[50,120,53,87,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":106,"learnset":{"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}],"rom_address":3302574},"rom_address":3291456,"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[51,0],"base_stats":[50,105,79,76,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":107,"learnset":{"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}],"rom_address":3302606},"rom_address":3291484,"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[20,12],"base_stats":[90,55,75,30,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":108,"learnset":{"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}],"rom_address":3302636},"rom_address":3291512,"tmhm_learnset":"00B43E76EFF37625","types":[0,0]},{"abilities":[26,0],"base_stats":[40,65,95,35,60,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":35,"species":110}],"friendship":70,"id":109,"learnset":{"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}],"rom_address":3302664},"rom_address":3291540,"tmhm_learnset":"00403F2EA5930E20","types":[3,3]},{"abilities":[26,0],"base_stats":[65,90,120,60,85,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":110,"learnset":{"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}],"rom_address":3302690},"rom_address":3291568,"tmhm_learnset":"00403F2EA5934E20","types":[3,3]},{"abilities":[31,69],"base_stats":[80,85,95,25,30,30],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":42,"species":112}],"friendship":70,"id":111,"learnset":{"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}],"rom_address":3302716},"rom_address":3291596,"tmhm_learnset":"00A03E768FD33630","types":[4,5]},{"abilities":[31,69],"base_stats":[105,130,120,40,45,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":112,"learnset":{"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}],"rom_address":3302742},"rom_address":3291624,"tmhm_learnset":"00B43E76CFD37631","types":[4,5]},{"abilities":[30,32],"base_stats":[250,5,5,50,35,105],"catch_rate":30,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":242}],"friendship":140,"id":113,"learnset":{"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}],"rom_address":3302768},"rom_address":3291652,"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[34,0],"base_stats":[65,55,115,60,100,40],"catch_rate":45,"evolutions":[],"friendship":70,"id":114,"learnset":{"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}],"rom_address":3302798},"rom_address":3291680,"tmhm_learnset":"00C43E0884354720","types":[12,12]},{"abilities":[48,0],"base_stats":[105,95,80,90,40,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":115,"learnset":{"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}],"rom_address":3302828},"rom_address":3291708,"tmhm_learnset":"00B43EF6EFF37675","types":[0,0]},{"abilities":[33,0],"base_stats":[30,40,70,60,70,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":32,"species":117}],"friendship":70,"id":116,"learnset":{"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}],"rom_address":3302854},"rom_address":3291736,"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[38,0],"base_stats":[55,65,95,85,95,45],"catch_rate":75,"evolutions":[{"method":"ITEM","param":201,"species":230}],"friendship":70,"id":117,"learnset":{"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}],"rom_address":3302878},"rom_address":3291764,"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[33,41],"base_stats":[45,67,60,63,35,50],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":119}],"friendship":70,"id":118,"learnset":{"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}],"rom_address":3302902},"rom_address":3291792,"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,41],"base_stats":[80,92,65,68,65,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":119,"learnset":{"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}],"rom_address":3302926},"rom_address":3291820,"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[35,30],"base_stats":[30,45,55,85,70,55],"catch_rate":225,"evolutions":[{"method":"ITEM","param":97,"species":121}],"friendship":70,"id":120,"learnset":{"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}],"rom_address":3302950},"rom_address":3291848,"tmhm_learnset":"03500E019593B264","types":[11,11]},{"abilities":[35,30],"base_stats":[60,75,85,115,100,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":121,"learnset":{"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}],"rom_address":3302980},"rom_address":3291876,"tmhm_learnset":"03508E019593F264","types":[11,14]},{"abilities":[43,0],"base_stats":[40,45,65,90,100,120],"catch_rate":45,"evolutions":[],"friendship":70,"id":122,"learnset":{"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}],"rom_address":3302992},"rom_address":3291904,"tmhm_learnset":"0041BF03F5BBCE29","types":[14,14]},{"abilities":[68,0],"base_stats":[70,110,80,105,55,80],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":212}],"friendship":70,"id":123,"learnset":{"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}],"rom_address":3303030},"rom_address":3291932,"tmhm_learnset":"00847E8084134620","types":[6,2]},{"abilities":[12,0],"base_stats":[65,50,35,95,115,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":124,"learnset":{"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}],"rom_address":3303058},"rom_address":3291960,"tmhm_learnset":"0040BF01F413FA6D","types":[15,14]},{"abilities":[9,0],"base_stats":[65,83,57,105,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":125,"learnset":{"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}],"rom_address":3303086},"rom_address":3291988,"tmhm_learnset":"00E03E02D5D3C221","types":[13,13]},{"abilities":[49,0],"base_stats":[65,95,57,93,100,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":126,"learnset":{"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}],"rom_address":3303108},"rom_address":3292016,"tmhm_learnset":"00A03E24D4514621","types":[10,10]},{"abilities":[52,0],"base_stats":[65,125,100,85,55,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":127,"learnset":{"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}],"rom_address":3303134},"rom_address":3292044,"tmhm_learnset":"00A43E40CE1346A1","types":[6,6]},{"abilities":[22,0],"base_stats":[75,100,95,110,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":128,"learnset":{"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}],"rom_address":3303160},"rom_address":3292072,"tmhm_learnset":"00B01E7687F37624","types":[0,0]},{"abilities":[33,0],"base_stats":[20,10,55,80,15,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":130}],"friendship":70,"id":129,"learnset":{"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}],"rom_address":3303186},"rom_address":3292100,"tmhm_learnset":"0000000000000000","types":[11,11]},{"abilities":[22,0],"base_stats":[95,125,79,81,60,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":130,"learnset":{"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}],"rom_address":3303200},"rom_address":3292128,"tmhm_learnset":"03B01F3487937A74","types":[11,2]},{"abilities":[11,75],"base_stats":[130,85,80,60,85,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":131,"learnset":{"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}],"rom_address":3303226},"rom_address":3292156,"tmhm_learnset":"03B01E0295DB7274","types":[11,15]},{"abilities":[7,0],"base_stats":[48,48,48,48,48,48],"catch_rate":35,"evolutions":[],"friendship":70,"id":132,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":144}],"rom_address":3303254},"rom_address":3292184,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[50,0],"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":{"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}],"rom_address":3303264},"rom_address":3292212,"tmhm_learnset":"00001E00AC530620","types":[0,0]},{"abilities":[11,0],"base_stats":[130,65,60,65,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":134,"learnset":{"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}],"rom_address":3303286},"rom_address":3292240,"tmhm_learnset":"03101E00AC537674","types":[11,11]},{"abilities":[10,0],"base_stats":[65,65,60,130,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":135,"learnset":{"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}],"rom_address":3303312},"rom_address":3292268,"tmhm_learnset":"00401E02ADD34630","types":[13,13]},{"abilities":[18,0],"base_stats":[65,130,60,65,95,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":136,"learnset":{"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}],"rom_address":3303338},"rom_address":3292296,"tmhm_learnset":"00021E24AC534630","types":[10,10]},{"abilities":[36,0],"base_stats":[65,60,70,40,85,75],"catch_rate":45,"evolutions":[{"method":"ITEM","param":218,"species":233}],"friendship":70,"id":137,"learnset":{"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}],"rom_address":3303364},"rom_address":3292324,"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[33,75],"base_stats":[35,40,100,35,90,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":139}],"friendship":70,"id":138,"learnset":{"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}],"rom_address":3303390},"rom_address":3292352,"tmhm_learnset":"03903E5084133264","types":[5,11]},{"abilities":[33,75],"base_stats":[70,60,125,55,115,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":139,"learnset":{"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}],"rom_address":3303416},"rom_address":3292380,"tmhm_learnset":"03903E5084137264","types":[5,11]},{"abilities":[33,4],"base_stats":[30,80,90,55,55,45],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":141}],"friendship":70,"id":140,"learnset":{"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}],"rom_address":3303444},"rom_address":3292408,"tmhm_learnset":"01903ED08C173264","types":[5,11]},{"abilities":[33,4],"base_stats":[60,115,105,80,65,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":141,"learnset":{"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}],"rom_address":3303470},"rom_address":3292436,"tmhm_learnset":"03943ED0CC177264","types":[5,11]},{"abilities":[69,46],"base_stats":[80,105,65,130,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":142,"learnset":{"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}],"rom_address":3303498},"rom_address":3292464,"tmhm_learnset":"00A87FF486534E32","types":[5,2]},{"abilities":[17,47],"base_stats":[160,110,65,30,65,110],"catch_rate":25,"evolutions":[],"friendship":70,"id":143,"learnset":{"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}],"rom_address":3303522},"rom_address":3292492,"tmhm_learnset":"00301E76F7B37625","types":[0,0]},{"abilities":[46,0],"base_stats":[90,85,100,85,95,125],"catch_rate":3,"evolutions":[],"friendship":35,"id":144,"learnset":{"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}],"rom_address":3303556},"rom_address":3292520,"tmhm_learnset":"00884E9184137674","types":[15,2]},{"abilities":[46,0],"base_stats":[90,90,85,100,125,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":145,"learnset":{"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}],"rom_address":3303580},"rom_address":3292548,"tmhm_learnset":"00C84E928593C630","types":[13,2]},{"abilities":[46,0],"base_stats":[90,100,90,90,125,85],"catch_rate":3,"evolutions":[],"friendship":35,"id":146,"learnset":{"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}],"rom_address":3303604},"rom_address":3292576,"tmhm_learnset":"008A4EB4841B4630","types":[10,2]},{"abilities":[61,0],"base_stats":[41,64,45,50,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":148}],"friendship":35,"id":147,"learnset":{"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}],"rom_address":3303628},"rom_address":3292604,"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[61,0],"base_stats":[61,84,65,70,70,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":149}],"friendship":35,"id":148,"learnset":{"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}],"rom_address":3303654},"rom_address":3292632,"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[39,0],"base_stats":[91,134,95,80,100,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":149,"learnset":{"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}],"rom_address":3303680},"rom_address":3292660,"tmhm_learnset":"03BC5EF6C7DB7677","types":[16,2]},{"abilities":[46,0],"base_stats":[106,110,90,130,154,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":150,"learnset":{"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}],"rom_address":3303708},"rom_address":3292688,"tmhm_learnset":"00E18FF7F7FBFEED","types":[14,14]},{"abilities":[28,0],"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":151,"learnset":{"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}],"rom_address":3303736},"rom_address":3292716,"tmhm_learnset":"03FFFFFFFFFFFFFF","types":[14,14]},{"abilities":[65,0],"base_stats":[45,49,65,45,49,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":153}],"friendship":70,"id":152,"learnset":{"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}],"rom_address":3303756},"rom_address":3292744,"tmhm_learnset":"00441E01847D8720","types":[12,12]},{"abilities":[65,0],"base_stats":[60,62,80,60,63,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":154}],"friendship":70,"id":153,"learnset":{"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}],"rom_address":3303782},"rom_address":3292772,"tmhm_learnset":"00E41E01847D8720","types":[12,12]},{"abilities":[65,0],"base_stats":[80,82,100,80,83,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":154,"learnset":{"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}],"rom_address":3303808},"rom_address":3292800,"tmhm_learnset":"00E41E01867DC720","types":[12,12]},{"abilities":[66,0],"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":14,"species":156}],"friendship":70,"id":155,"learnset":{"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}],"rom_address":3303834},"rom_address":3292828,"tmhm_learnset":"00061EA48C110620","types":[10,10]},{"abilities":[66,0],"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":157}],"friendship":70,"id":156,"learnset":{"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}],"rom_address":3303856},"rom_address":3292856,"tmhm_learnset":"00A61EA4CC110631","types":[10,10]},{"abilities":[66,0],"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":157,"learnset":{"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}],"rom_address":3303878},"rom_address":3292884,"tmhm_learnset":"00A61EA4CE114631","types":[10,10]},{"abilities":[67,0],"base_stats":[50,65,64,43,44,48],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":18,"species":159}],"friendship":70,"id":158,"learnset":{"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}],"rom_address":3303900},"rom_address":3292912,"tmhm_learnset":"03141E80CC533265","types":[11,11]},{"abilities":[67,0],"base_stats":[65,80,80,58,59,63],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":160}],"friendship":70,"id":159,"learnset":{"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}],"rom_address":3303924},"rom_address":3292940,"tmhm_learnset":"03B41E80CC533275","types":[11,11]},{"abilities":[67,0],"base_stats":[85,105,100,78,79,83],"catch_rate":45,"evolutions":[],"friendship":70,"id":160,"learnset":{"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}],"rom_address":3303948},"rom_address":3292968,"tmhm_learnset":"03B41E80CE537277","types":[11,11]},{"abilities":[50,51],"base_stats":[35,46,34,20,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":15,"species":162}],"friendship":70,"id":161,"learnset":{"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}],"rom_address":3303972},"rom_address":3292996,"tmhm_learnset":"00143E06ECF31625","types":[0,0]},{"abilities":[50,51],"base_stats":[85,76,64,90,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":162,"learnset":{"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}],"rom_address":3303998},"rom_address":3293024,"tmhm_learnset":"00B43E06EDF37625","types":[0,0]},{"abilities":[15,51],"base_stats":[60,30,30,50,36,56],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":164}],"friendship":70,"id":163,"learnset":{"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}],"rom_address":3304024},"rom_address":3293052,"tmhm_learnset":"00487E81B4130620","types":[0,2]},{"abilities":[15,51],"base_stats":[100,50,50,70,76,96],"catch_rate":90,"evolutions":[],"friendship":70,"id":164,"learnset":{"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}],"rom_address":3304048},"rom_address":3293080,"tmhm_learnset":"00487E81B4134620","types":[0,2]},{"abilities":[68,48],"base_stats":[40,20,30,55,40,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":166}],"friendship":70,"id":165,"learnset":{"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}],"rom_address":3304072},"rom_address":3293108,"tmhm_learnset":"00403E81CC3D8621","types":[6,2]},{"abilities":[68,48],"base_stats":[55,35,50,85,55,110],"catch_rate":90,"evolutions":[],"friendship":70,"id":166,"learnset":{"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}],"rom_address":3304100},"rom_address":3293136,"tmhm_learnset":"00403E81CC3DC621","types":[6,2]},{"abilities":[68,15],"base_stats":[40,60,40,30,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":168}],"friendship":70,"id":167,"learnset":{"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}],"rom_address":3304128},"rom_address":3293164,"tmhm_learnset":"00403E089C350620","types":[6,3]},{"abilities":[68,15],"base_stats":[70,90,70,40,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":168,"learnset":{"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}],"rom_address":3304154},"rom_address":3293192,"tmhm_learnset":"00403E089C354620","types":[6,3]},{"abilities":[39,0],"base_stats":[85,90,80,130,70,80],"catch_rate":90,"evolutions":[],"friendship":70,"id":169,"learnset":{"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}],"rom_address":3304180},"rom_address":3293220,"tmhm_learnset":"00097F88A4174E20","types":[3,2]},{"abilities":[10,35],"base_stats":[75,38,38,67,56,56],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":27,"species":171}],"friendship":70,"id":170,"learnset":{"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}],"rom_address":3304208},"rom_address":3293248,"tmhm_learnset":"03501E0285933264","types":[11,13]},{"abilities":[10,35],"base_stats":[125,58,58,67,76,76],"catch_rate":75,"evolutions":[],"friendship":70,"id":171,"learnset":{"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}],"rom_address":3304234},"rom_address":3293276,"tmhm_learnset":"03501E0285937264","types":[11,13]},{"abilities":[9,0],"base_stats":[20,40,15,60,35,35],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":25}],"friendship":70,"id":172,"learnset":{"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}],"rom_address":3304260},"rom_address":3293304,"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[56,0],"base_stats":[50,25,28,15,45,55],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":35}],"friendship":140,"id":173,"learnset":{"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}],"rom_address":3304276},"rom_address":3293332,"tmhm_learnset":"00401E27BC7B8624","types":[0,0]},{"abilities":[56,0],"base_stats":[90,30,15,15,40,20],"catch_rate":170,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":39}],"friendship":70,"id":174,"learnset":{"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}],"rom_address":3304292},"rom_address":3293360,"tmhm_learnset":"00401E27BC3B8624","types":[0,0]},{"abilities":[55,32],"base_stats":[35,20,65,20,40,65],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":176}],"friendship":70,"id":175,"learnset":{"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}],"rom_address":3304308},"rom_address":3293388,"tmhm_learnset":"00C01E27B43B8624","types":[0,0]},{"abilities":[55,32],"base_stats":[55,40,85,40,80,105],"catch_rate":75,"evolutions":[],"friendship":70,"id":176,"learnset":{"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}],"rom_address":3304334},"rom_address":3293416,"tmhm_learnset":"00C85EA7F43BC625","types":[0,2]},{"abilities":[28,48],"base_stats":[40,50,45,70,70,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":178}],"friendship":70,"id":177,"learnset":{"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}],"rom_address":3304360},"rom_address":3293444,"tmhm_learnset":"0040FE81B4378628","types":[14,2]},{"abilities":[28,48],"base_stats":[65,75,70,95,95,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":178,"learnset":{"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}],"rom_address":3304382},"rom_address":3293472,"tmhm_learnset":"0048FE81B437C628","types":[14,2]},{"abilities":[9,0],"base_stats":[55,40,40,35,65,45],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":15,"species":180}],"friendship":70,"id":179,"learnset":{"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}],"rom_address":3304404},"rom_address":3293500,"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[9,0],"base_stats":[70,55,55,45,80,60],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":181}],"friendship":70,"id":180,"learnset":{"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}],"rom_address":3304424},"rom_address":3293528,"tmhm_learnset":"00E01E02C5D38221","types":[13,13]},{"abilities":[9,0],"base_stats":[90,75,75,55,115,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":181,"learnset":{"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}],"rom_address":3304444},"rom_address":3293556,"tmhm_learnset":"00E01E02C5D3C221","types":[13,13]},{"abilities":[34,0],"base_stats":[75,80,85,50,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":182,"learnset":{"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}],"rom_address":3304466},"rom_address":3293584,"tmhm_learnset":"00441E08843D4720","types":[12,12]},{"abilities":[47,37],"base_stats":[70,20,50,40,20,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":18,"species":184}],"friendship":70,"id":183,"learnset":{"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}],"rom_address":3304480},"rom_address":3293612,"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[47,37],"base_stats":[100,50,80,50,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":184,"learnset":{"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}],"rom_address":3304506},"rom_address":3293640,"tmhm_learnset":"03B01E00CC537265","types":[11,11]},{"abilities":[5,69],"base_stats":[70,100,115,30,30,65],"catch_rate":65,"evolutions":[],"friendship":70,"id":185,"learnset":{"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}],"rom_address":3304532},"rom_address":3293668,"tmhm_learnset":"00A03E50CE110E29","types":[5,5]},{"abilities":[11,6],"base_stats":[90,75,75,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":186,"learnset":{"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}],"rom_address":3304556},"rom_address":3293696,"tmhm_learnset":"03B03E00DE137265","types":[11,11]},{"abilities":[34,0],"base_stats":[35,35,40,50,35,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":188}],"friendship":70,"id":187,"learnset":{"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}],"rom_address":3304570},"rom_address":3293724,"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"base_stats":[55,45,50,80,45,65],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":27,"species":189}],"friendship":70,"id":188,"learnset":{"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}],"rom_address":3304598},"rom_address":3293752,"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"base_stats":[75,55,70,110,55,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":189,"learnset":{"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}],"rom_address":3304626},"rom_address":3293780,"tmhm_learnset":"00401E8084354720","types":[12,2]},{"abilities":[50,53],"base_stats":[55,70,55,85,40,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":190,"learnset":{"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}],"rom_address":3304654},"rom_address":3293808,"tmhm_learnset":"00A53E82EDF30E25","types":[0,0]},{"abilities":[34,0],"base_stats":[30,30,30,30,30,30],"catch_rate":235,"evolutions":[{"method":"ITEM","param":93,"species":192}],"friendship":70,"id":191,"learnset":{"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}],"rom_address":3304680},"rom_address":3293836,"tmhm_learnset":"00441E08843D8720","types":[12,12]},{"abilities":[34,0],"base_stats":[75,75,55,30,105,85],"catch_rate":120,"evolutions":[],"friendship":70,"id":192,"learnset":{"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}],"rom_address":3304704},"rom_address":3293864,"tmhm_learnset":"00441E08843DC720","types":[12,12]},{"abilities":[3,14],"base_stats":[65,65,45,95,75,45],"catch_rate":75,"evolutions":[],"friendship":70,"id":193,"learnset":{"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}],"rom_address":3304728},"rom_address":3293892,"tmhm_learnset":"00407E80B4350620","types":[6,2]},{"abilities":[6,11],"base_stats":[55,45,45,15,25,25],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":195}],"friendship":70,"id":194,"learnset":{"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}],"rom_address":3304754},"rom_address":3293920,"tmhm_learnset":"03D01E188E533264","types":[11,4]},{"abilities":[6,11],"base_stats":[95,85,85,35,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":195,"learnset":{"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}],"rom_address":3304780},"rom_address":3293948,"tmhm_learnset":"03F01E58CE537265","types":[11,4]},{"abilities":[28,0],"base_stats":[65,65,60,110,130,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":196,"learnset":{"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}],"rom_address":3304806},"rom_address":3293976,"tmhm_learnset":"00449E01BC53C628","types":[14,14]},{"abilities":[28,0],"base_stats":[95,65,110,65,60,130],"catch_rate":45,"evolutions":[],"friendship":35,"id":197,"learnset":{"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}],"rom_address":3304832},"rom_address":3294004,"tmhm_learnset":"00451F00BC534E20","types":[17,17]},{"abilities":[15,0],"base_stats":[60,85,42,91,85,42],"catch_rate":30,"evolutions":[],"friendship":35,"id":198,"learnset":{"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}],"rom_address":3304858},"rom_address":3294032,"tmhm_learnset":"00097F80A4130E28","types":[17,2]},{"abilities":[12,20],"base_stats":[95,75,80,30,100,110],"catch_rate":70,"evolutions":[],"friendship":70,"id":199,"learnset":{"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}],"rom_address":3304882},"rom_address":3294060,"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[26,0],"base_stats":[60,60,60,85,85,85],"catch_rate":45,"evolutions":[],"friendship":35,"id":200,"learnset":{"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}],"rom_address":3304906},"rom_address":3294088,"tmhm_learnset":"0041BF82B5930E28","types":[7,7]},{"abilities":[26,0],"base_stats":[48,72,48,48,72,48],"catch_rate":225,"evolutions":[],"friendship":70,"id":201,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":237}],"rom_address":3304932},"rom_address":3294116,"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[23,0],"base_stats":[190,33,58,33,33,58],"catch_rate":45,"evolutions":[],"friendship":70,"id":202,"learnset":{"moves":[{"level":1,"move_id":68},{"level":1,"move_id":243},{"level":1,"move_id":219},{"level":1,"move_id":194}],"rom_address":3304942},"rom_address":3294144,"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[39,48],"base_stats":[70,80,65,85,90,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":203,"learnset":{"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}],"rom_address":3304952},"rom_address":3294172,"tmhm_learnset":"00E0BE03B7D38628","types":[0,14]},{"abilities":[5,0],"base_stats":[50,65,90,15,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":205}],"friendship":70,"id":204,"learnset":{"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}],"rom_address":3304978},"rom_address":3294200,"tmhm_learnset":"00A01E118E358620","types":[6,6]},{"abilities":[5,0],"base_stats":[75,90,140,40,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":205,"learnset":{"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}],"rom_address":3305002},"rom_address":3294228,"tmhm_learnset":"00A01E118E35C620","types":[6,8]},{"abilities":[32,50],"base_stats":[100,70,70,45,65,65],"catch_rate":190,"evolutions":[],"friendship":70,"id":206,"learnset":{"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}],"rom_address":3305026},"rom_address":3294256,"tmhm_learnset":"00A03E66AFF3362C","types":[0,0]},{"abilities":[52,8],"base_stats":[65,75,105,85,35,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":207,"learnset":{"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}],"rom_address":3305052},"rom_address":3294284,"tmhm_learnset":"00A47ED88E530620","types":[4,2]},{"abilities":[69,5],"base_stats":[75,85,200,30,55,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":208,"learnset":{"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}],"rom_address":3305076},"rom_address":3294312,"tmhm_learnset":"00A41F508E514E30","types":[8,4]},{"abilities":[22,50],"base_stats":[60,80,50,30,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":23,"species":210}],"friendship":70,"id":209,"learnset":{"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}],"rom_address":3305104},"rom_address":3294340,"tmhm_learnset":"00A23F2EEFB30EB5","types":[0,0]},{"abilities":[22,22],"base_stats":[90,120,75,45,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":210,"learnset":{"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}],"rom_address":3305130},"rom_address":3294368,"tmhm_learnset":"00A23F6EEFF34EB5","types":[0,0]},{"abilities":[38,33],"base_stats":[65,95,75,85,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":211,"learnset":{"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}],"rom_address":3305156},"rom_address":3294396,"tmhm_learnset":"03101E0AA4133264","types":[11,3]},{"abilities":[68,0],"base_stats":[70,130,100,65,55,80],"catch_rate":25,"evolutions":[],"friendship":70,"id":212,"learnset":{"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}],"rom_address":3305178},"rom_address":3294424,"tmhm_learnset":"00A47E9084134620","types":[6,8]},{"abilities":[5,0],"base_stats":[20,10,230,5,10,230],"catch_rate":190,"evolutions":[],"friendship":70,"id":213,"learnset":{"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}],"rom_address":3305206},"rom_address":3294452,"tmhm_learnset":"00E01E588E190620","types":[6,5]},{"abilities":[68,62],"base_stats":[80,125,75,85,40,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":214,"learnset":{"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}],"rom_address":3305226},"rom_address":3294480,"tmhm_learnset":"00A43E40CE1346A1","types":[6,1]},{"abilities":[39,51],"base_stats":[55,95,55,115,35,75],"catch_rate":60,"evolutions":[],"friendship":35,"id":215,"learnset":{"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}],"rom_address":3305252},"rom_address":3294508,"tmhm_learnset":"00B53F80EC533E69","types":[17,15]},{"abilities":[53,0],"base_stats":[60,80,50,40,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":217}],"friendship":70,"id":216,"learnset":{"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}],"rom_address":3305280},"rom_address":3294536,"tmhm_learnset":"00A43F80CE130EB1","types":[0,0]},{"abilities":[62,0],"base_stats":[90,130,75,55,75,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":217,"learnset":{"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}],"rom_address":3305306},"rom_address":3294564,"tmhm_learnset":"00A43FC0CE134EB1","types":[0,0]},{"abilities":[40,49],"base_stats":[40,40,40,20,70,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":219}],"friendship":70,"id":218,"learnset":{"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}],"rom_address":3305332},"rom_address":3294592,"tmhm_learnset":"00821E2584118620","types":[10,10]},{"abilities":[40,49],"base_stats":[50,50,120,30,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":219,"learnset":{"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}],"rom_address":3305356},"rom_address":3294620,"tmhm_learnset":"00A21E758611C620","types":[10,5]},{"abilities":[12,0],"base_stats":[50,50,40,50,30,30],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":221}],"friendship":70,"id":220,"learnset":{"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}],"rom_address":3305380},"rom_address":3294648,"tmhm_learnset":"00A01E518E13B270","types":[15,4]},{"abilities":[12,0],"base_stats":[100,100,80,50,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":221,"learnset":{"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}],"rom_address":3305402},"rom_address":3294676,"tmhm_learnset":"00A01E518E13F270","types":[15,4]},{"abilities":[55,30],"base_stats":[55,55,85,35,65,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":222,"learnset":{"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}],"rom_address":3305426},"rom_address":3294704,"tmhm_learnset":"00B01E51BE1BB66C","types":[11,5]},{"abilities":[55,0],"base_stats":[35,65,35,65,65,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":224}],"friendship":70,"id":223,"learnset":{"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}],"rom_address":3305454},"rom_address":3294732,"tmhm_learnset":"03103E2494137624","types":[11,11]},{"abilities":[21,0],"base_stats":[75,105,75,45,105,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":224,"learnset":{"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}],"rom_address":3305478},"rom_address":3294760,"tmhm_learnset":"03103E2C94137724","types":[11,11]},{"abilities":[72,55],"base_stats":[45,55,45,75,65,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":225,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":217}],"rom_address":3305504},"rom_address":3294788,"tmhm_learnset":"00083E8084133265","types":[15,2]},{"abilities":[33,11],"base_stats":[65,40,70,70,80,140],"catch_rate":25,"evolutions":[],"friendship":70,"id":226,"learnset":{"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}],"rom_address":3305514},"rom_address":3294816,"tmhm_learnset":"03101E8086133264","types":[11,2]},{"abilities":[51,5],"base_stats":[65,80,140,70,40,70],"catch_rate":25,"evolutions":[],"friendship":70,"id":227,"learnset":{"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}],"rom_address":3305538},"rom_address":3294844,"tmhm_learnset":"008C7F9084110E30","types":[8,2]},{"abilities":[48,18],"base_stats":[45,60,30,65,80,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":24,"species":229}],"friendship":35,"id":228,"learnset":{"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}],"rom_address":3305564},"rom_address":3294872,"tmhm_learnset":"00833F2CA4710E30","types":[17,10]},{"abilities":[48,18],"base_stats":[75,90,50,95,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":229,"learnset":{"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}],"rom_address":3305590},"rom_address":3294900,"tmhm_learnset":"00A33F2CA4714E30","types":[17,10]},{"abilities":[33,0],"base_stats":[75,95,95,85,95,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":230,"learnset":{"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}],"rom_address":3305616},"rom_address":3294928,"tmhm_learnset":"03101E0084137264","types":[11,16]},{"abilities":[53,0],"base_stats":[90,60,60,40,40,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":25,"species":232}],"friendship":70,"id":231,"learnset":{"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}],"rom_address":3305640},"rom_address":3294956,"tmhm_learnset":"00A01E5086510630","types":[4,4]},{"abilities":[5,0],"base_stats":[90,120,120,50,60,60],"catch_rate":60,"evolutions":[],"friendship":70,"id":232,"learnset":{"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}],"rom_address":3305662},"rom_address":3294984,"tmhm_learnset":"00A01E5086514630","types":[4,4]},{"abilities":[36,0],"base_stats":[85,80,90,60,105,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":233,"learnset":{"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}],"rom_address":3305684},"rom_address":3295012,"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[22,0],"base_stats":[73,95,62,85,85,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":234,"learnset":{"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}],"rom_address":3305710},"rom_address":3295040,"tmhm_learnset":"0040BE03B7F38638","types":[0,0]},{"abilities":[20,0],"base_stats":[55,20,35,75,20,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":235,"learnset":{"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}],"rom_address":3305736},"rom_address":3295068,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[62,0],"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":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3305764},"rom_address":3295096,"tmhm_learnset":"00A03E00C61306A0","types":[1,1]},{"abilities":[22,0],"base_stats":[50,95,95,70,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":237,"learnset":{"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}],"rom_address":3305774},"rom_address":3295124,"tmhm_learnset":"00A03E10CE1306A0","types":[1,1]},{"abilities":[12,0],"base_stats":[45,30,15,65,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":124}],"friendship":70,"id":238,"learnset":{"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}],"rom_address":3305802},"rom_address":3295152,"tmhm_learnset":"0040BE01B413B26C","types":[15,14]},{"abilities":[9,0],"base_stats":[45,63,37,95,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":125}],"friendship":70,"id":239,"learnset":{"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}],"rom_address":3305830},"rom_address":3295180,"tmhm_learnset":"00C03E02D5938221","types":[13,13]},{"abilities":[49,0],"base_stats":[45,75,37,83,70,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":126}],"friendship":70,"id":240,"learnset":{"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}],"rom_address":3305852},"rom_address":3295208,"tmhm_learnset":"00803E24D4510621","types":[10,10]},{"abilities":[47,0],"base_stats":[95,80,105,100,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":241,"learnset":{"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}],"rom_address":3305878},"rom_address":3295236,"tmhm_learnset":"00B01E52E7F37625","types":[0,0]},{"abilities":[30,32],"base_stats":[255,10,10,55,75,135],"catch_rate":30,"evolutions":[],"friendship":140,"id":242,"learnset":{"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}],"rom_address":3305904},"rom_address":3295264,"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[46,0],"base_stats":[90,85,75,115,115,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":243,"learnset":{"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}],"rom_address":3305934},"rom_address":3295292,"tmhm_learnset":"00E40E138DD34638","types":[13,13]},{"abilities":[46,0],"base_stats":[115,115,85,100,90,75],"catch_rate":3,"evolutions":[],"friendship":35,"id":244,"learnset":{"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}],"rom_address":3305960},"rom_address":3295320,"tmhm_learnset":"00E40E358C734638","types":[10,10]},{"abilities":[46,0],"base_stats":[100,75,115,85,90,115],"catch_rate":3,"evolutions":[],"friendship":35,"id":245,"learnset":{"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}],"rom_address":3305986},"rom_address":3295348,"tmhm_learnset":"03940E118C53767C","types":[11,11]},{"abilities":[62,0],"base_stats":[50,64,50,41,45,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":247}],"friendship":35,"id":246,"learnset":{"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}],"rom_address":3306012},"rom_address":3295376,"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[61,0],"base_stats":[70,84,70,51,65,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":248}],"friendship":35,"id":247,"learnset":{"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}],"rom_address":3306038},"rom_address":3295404,"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[45,0],"base_stats":[100,134,110,61,95,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":248,"learnset":{"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}],"rom_address":3306064},"rom_address":3295432,"tmhm_learnset":"00B41FF6CFD37E37","types":[5,17]},{"abilities":[46,0],"base_stats":[106,90,130,110,90,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":249,"learnset":{"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}],"rom_address":3306090},"rom_address":3295460,"tmhm_learnset":"03B8CE93B7DFF67C","types":[14,2]},{"abilities":[46,0],"base_stats":[106,130,90,90,110,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":250,"learnset":{"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}],"rom_address":3306118},"rom_address":3295488,"tmhm_learnset":"00EA4EB7B7BFC638","types":[10,2]},{"abilities":[30,0],"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":251,"learnset":{"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}],"rom_address":3306146},"rom_address":3295516,"tmhm_learnset":"00448E93B43FC62C","types":[14,12]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":252,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306166},"rom_address":3295544,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":253,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306176},"rom_address":3295572,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":254,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306186},"rom_address":3295600,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":255,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306196},"rom_address":3295628,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":256,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306206},"rom_address":3295656,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":257,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306216},"rom_address":3295684,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":258,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306226},"rom_address":3295712,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":259,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306236},"rom_address":3295740,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":260,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306246},"rom_address":3295768,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":261,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306256},"rom_address":3295796,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":262,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306266},"rom_address":3295824,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":263,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306276},"rom_address":3295852,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":264,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306286},"rom_address":3295880,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":265,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306296},"rom_address":3295908,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":266,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306306},"rom_address":3295936,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":267,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306316},"rom_address":3295964,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":268,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306326},"rom_address":3295992,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":269,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306336},"rom_address":3296020,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":270,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306346},"rom_address":3296048,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":271,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306356},"rom_address":3296076,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":272,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306366},"rom_address":3296104,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":273,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306376},"rom_address":3296132,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":274,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306386},"rom_address":3296160,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":275,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306396},"rom_address":3296188,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":276,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}],"rom_address":3306406},"rom_address":3296216,"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"base_stats":[40,45,35,70,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":278}],"friendship":70,"id":277,"learnset":{"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}],"rom_address":3306416},"rom_address":3296244,"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"base_stats":[50,65,45,95,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":279}],"friendship":70,"id":278,"learnset":{"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}],"rom_address":3306444},"rom_address":3296272,"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"base_stats":[70,85,65,120,105,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":279,"learnset":{"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}],"rom_address":3306474},"rom_address":3296300,"tmhm_learnset":"00E41EC0CE7D4733","types":[12,12]},{"abilities":[66,0],"base_stats":[45,60,40,45,70,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":281}],"friendship":70,"id":280,"learnset":{"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}],"rom_address":3306504},"rom_address":3296328,"tmhm_learnset":"00A61EE48C110620","types":[10,10]},{"abilities":[66,0],"base_stats":[60,85,60,55,85,60],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":282}],"friendship":70,"id":281,"learnset":{"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}],"rom_address":3306532},"rom_address":3296356,"tmhm_learnset":"00A61EE4CC1106A1","types":[10,1]},{"abilities":[66,0],"base_stats":[80,120,70,80,110,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":282,"learnset":{"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}],"rom_address":3306562},"rom_address":3296384,"tmhm_learnset":"00A61EE4CE1146B1","types":[10,1]},{"abilities":[67,0],"base_stats":[50,70,50,40,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":284}],"friendship":70,"id":283,"learnset":{"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}],"rom_address":3306596},"rom_address":3296412,"tmhm_learnset":"03B01E408C533264","types":[11,11]},{"abilities":[67,0],"base_stats":[70,85,70,50,60,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":285}],"friendship":70,"id":284,"learnset":{"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}],"rom_address":3306626},"rom_address":3296440,"tmhm_learnset":"03B01E408E533264","types":[11,4]},{"abilities":[67,0],"base_stats":[100,110,90,60,85,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":285,"learnset":{"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}],"rom_address":3306658},"rom_address":3296468,"tmhm_learnset":"03B01E40CE537275","types":[11,4]},{"abilities":[50,0],"base_stats":[35,55,35,35,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":287}],"friendship":70,"id":286,"learnset":{"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}],"rom_address":3306690},"rom_address":3296496,"tmhm_learnset":"00813F00AC530E30","types":[17,17]},{"abilities":[22,0],"base_stats":[70,90,70,70,60,60],"catch_rate":127,"evolutions":[],"friendship":70,"id":287,"learnset":{"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}],"rom_address":3306722},"rom_address":3296524,"tmhm_learnset":"00A13F00AC534E30","types":[17,17]},{"abilities":[53,0],"base_stats":[38,30,41,60,30,41],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":289}],"friendship":70,"id":288,"learnset":{"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}],"rom_address":3306754},"rom_address":3296552,"tmhm_learnset":"00943E02ADD33624","types":[0,0]},{"abilities":[53,0],"base_stats":[78,70,61,100,50,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":289,"learnset":{"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}],"rom_address":3306784},"rom_address":3296580,"tmhm_learnset":"00B43E02ADD37634","types":[0,0]},{"abilities":[19,0],"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":{"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}],"rom_address":3306814},"rom_address":3296608,"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":292}],"friendship":70,"id":291,"learnset":{"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}],"rom_address":3306826},"rom_address":3296636,"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[68,0],"base_stats":[60,70,50,65,90,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":292,"learnset":{"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}],"rom_address":3306838},"rom_address":3296664,"tmhm_learnset":"00403E80B43D4620","types":[6,2]},{"abilities":[61,0],"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":294}],"friendship":70,"id":293,"learnset":{"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}],"rom_address":3306866},"rom_address":3296692,"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[19,0],"base_stats":[60,50,70,65,50,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":294,"learnset":{"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}],"rom_address":3306878},"rom_address":3296720,"tmhm_learnset":"00403E88B435C620","types":[6,3]},{"abilities":[33,44],"base_stats":[40,30,30,30,40,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":296}],"friendship":70,"id":295,"learnset":{"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}],"rom_address":3306906},"rom_address":3296748,"tmhm_learnset":"00503E0084373764","types":[11,12]},{"abilities":[33,44],"base_stats":[60,50,50,50,60,70],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":297}],"friendship":70,"id":296,"learnset":{"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}],"rom_address":3306928},"rom_address":3296776,"tmhm_learnset":"03F03E00C4373764","types":[11,12]},{"abilities":[33,44],"base_stats":[80,70,70,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":297,"learnset":{"moves":[{"level":1,"move_id":310},{"level":1,"move_id":45},{"level":1,"move_id":71},{"level":1,"move_id":267}],"rom_address":3306956},"rom_address":3296804,"tmhm_learnset":"03F03E00C4377765","types":[11,12]},{"abilities":[34,48],"base_stats":[40,40,50,30,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":299}],"friendship":70,"id":298,"learnset":{"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}],"rom_address":3306966},"rom_address":3296832,"tmhm_learnset":"00C01E00AC350720","types":[12,12]},{"abilities":[34,48],"base_stats":[70,70,40,60,60,40],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":300}],"friendship":70,"id":299,"learnset":{"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}],"rom_address":3306988},"rom_address":3296860,"tmhm_learnset":"00E43F40EC354720","types":[12,17]},{"abilities":[34,48],"base_stats":[90,100,60,80,90,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":300,"learnset":{"moves":[{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":1,"move_id":74},{"level":1,"move_id":267}],"rom_address":3307016},"rom_address":3296888,"tmhm_learnset":"00E43FC0EC354720","types":[12,17]},{"abilities":[14,0],"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":{"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}],"rom_address":3307026},"rom_address":3296916,"tmhm_learnset":"00440E90AC350620","types":[6,4]},{"abilities":[3,0],"base_stats":[61,90,45,160,50,50],"catch_rate":120,"evolutions":[],"friendship":70,"id":302,"learnset":{"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}],"rom_address":3307052},"rom_address":3296944,"tmhm_learnset":"00443E90AC354620","types":[6,2]},{"abilities":[25,0],"base_stats":[1,90,45,40,30,30],"catch_rate":45,"evolutions":[],"friendship":70,"id":303,"learnset":{"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}],"rom_address":3307084},"rom_address":3296972,"tmhm_learnset":"00442E90AC354620","types":[6,7]},{"abilities":[62,0],"base_stats":[40,55,30,85,30,30],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":305}],"friendship":70,"id":304,"learnset":{"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}],"rom_address":3307110},"rom_address":3297000,"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[62,0],"base_stats":[60,85,60,125,50,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":305,"learnset":{"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}],"rom_address":3307134},"rom_address":3297028,"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[27,0],"base_stats":[60,40,60,35,40,60],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":23,"species":307}],"friendship":70,"id":306,"learnset":{"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}],"rom_address":3307158},"rom_address":3297056,"tmhm_learnset":"00411E08843D0720","types":[12,12]},{"abilities":[27,0],"base_stats":[60,130,80,70,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":307,"learnset":{"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}],"rom_address":3307186},"rom_address":3297084,"tmhm_learnset":"00E51E08C47D47A1","types":[12,1]},{"abilities":[20,0],"base_stats":[60,60,60,60,60,60],"catch_rate":255,"evolutions":[],"friendship":70,"id":308,"learnset":{"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}],"rom_address":3307216},"rom_address":3297112,"tmhm_learnset":"00E1BE42FC1B062D","types":[0,0]},{"abilities":[51,0],"base_stats":[40,30,30,85,55,30],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":310}],"friendship":70,"id":309,"learnset":{"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}],"rom_address":3307246},"rom_address":3297140,"tmhm_learnset":"00087E8284133264","types":[11,2]},{"abilities":[51,0],"base_stats":[60,50,100,65,85,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":310,"learnset":{"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}],"rom_address":3307268},"rom_address":3297168,"tmhm_learnset":"00187E8284137264","types":[11,2]},{"abilities":[33,0],"base_stats":[40,30,32,65,50,52],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":312}],"friendship":70,"id":311,"learnset":{"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}],"rom_address":3307296},"rom_address":3297196,"tmhm_learnset":"00403E00A4373624","types":[6,11]},{"abilities":[22,0],"base_stats":[70,60,62,60,80,82],"catch_rate":75,"evolutions":[],"friendship":70,"id":312,"learnset":{"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}],"rom_address":3307320},"rom_address":3297224,"tmhm_learnset":"00403E80A4377624","types":[6,2]},{"abilities":[41,12],"base_stats":[130,70,35,60,70,35],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":40,"species":314}],"friendship":70,"id":313,"learnset":{"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}],"rom_address":3307346},"rom_address":3297252,"tmhm_learnset":"03B01E4086133274","types":[11,11]},{"abilities":[41,12],"base_stats":[170,90,45,60,90,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":314,"learnset":{"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}],"rom_address":3307378},"rom_address":3297280,"tmhm_learnset":"03B01E4086137274","types":[11,11]},{"abilities":[56,0],"base_stats":[50,45,45,50,35,35],"catch_rate":255,"evolutions":[{"method":"ITEM","param":94,"species":316}],"friendship":70,"id":315,"learnset":{"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}],"rom_address":3307410},"rom_address":3297308,"tmhm_learnset":"00401E02ADFB362C","types":[0,0]},{"abilities":[56,0],"base_stats":[70,65,65,70,55,55],"catch_rate":60,"evolutions":[],"friendship":70,"id":316,"learnset":{"moves":[{"level":1,"move_id":45},{"level":1,"move_id":213},{"level":1,"move_id":47},{"level":1,"move_id":3}],"rom_address":3307440},"rom_address":3297336,"tmhm_learnset":"00E01E02ADFB762C","types":[0,0]},{"abilities":[16,0],"base_stats":[60,90,70,40,60,120],"catch_rate":200,"evolutions":[],"friendship":70,"id":317,"learnset":{"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}],"rom_address":3307450},"rom_address":3297364,"tmhm_learnset":"00E5BEE6EDF33625","types":[0,0]},{"abilities":[26,0],"base_stats":[40,40,55,55,40,70],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":36,"species":319}],"friendship":70,"id":318,"learnset":{"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}],"rom_address":3307478},"rom_address":3297392,"tmhm_learnset":"00408E51BE339620","types":[4,14]},{"abilities":[26,0],"base_stats":[60,70,105,75,70,120],"catch_rate":90,"evolutions":[],"friendship":70,"id":319,"learnset":{"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}],"rom_address":3307508},"rom_address":3297420,"tmhm_learnset":"00E08E51BE33D620","types":[4,14]},{"abilities":[5,42],"base_stats":[30,45,135,30,45,90],"catch_rate":255,"evolutions":[],"friendship":70,"id":320,"learnset":{"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}],"rom_address":3307540},"rom_address":3297448,"tmhm_learnset":"00A01F5287910E20","types":[5,5]},{"abilities":[73,0],"base_stats":[70,85,140,20,85,70],"catch_rate":90,"evolutions":[],"friendship":70,"id":321,"learnset":{"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}],"rom_address":3307568},"rom_address":3297476,"tmhm_learnset":"00A21E2C84510620","types":[10,10]},{"abilities":[51,0],"base_stats":[50,75,75,50,65,65],"catch_rate":45,"evolutions":[],"friendship":35,"id":322,"learnset":{"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}],"rom_address":3307600},"rom_address":3297504,"tmhm_learnset":"00C53FC2FC130E2D","types":[17,7]},{"abilities":[12,0],"base_stats":[50,48,43,60,46,41],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":324}],"friendship":70,"id":323,"learnset":{"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}],"rom_address":3307632},"rom_address":3297532,"tmhm_learnset":"03101E5086133264","types":[11,4]},{"abilities":[12,0],"base_stats":[110,78,73,60,76,71],"catch_rate":75,"evolutions":[],"friendship":70,"id":324,"learnset":{"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}],"rom_address":3307662},"rom_address":3297560,"tmhm_learnset":"03B01E5086137264","types":[11,4]},{"abilities":[33,0],"base_stats":[43,30,55,97,40,65],"catch_rate":225,"evolutions":[],"friendship":70,"id":325,"learnset":{"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}],"rom_address":3307692},"rom_address":3297588,"tmhm_learnset":"03101E00841B3264","types":[11,11]},{"abilities":[52,75],"base_stats":[43,80,65,35,50,35],"catch_rate":205,"evolutions":[{"method":"LEVEL","param":30,"species":327}],"friendship":70,"id":326,"learnset":{"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}],"rom_address":3307718},"rom_address":3297616,"tmhm_learnset":"01B41EC8CC133A64","types":[11,11]},{"abilities":[52,75],"base_stats":[63,120,85,55,90,55],"catch_rate":155,"evolutions":[],"friendship":70,"id":327,"learnset":{"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}],"rom_address":3307748},"rom_address":3297644,"tmhm_learnset":"03B41EC8CC137A64","types":[11,17]},{"abilities":[33,0],"base_stats":[20,15,20,80,10,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":30,"species":329}],"friendship":70,"id":328,"learnset":{"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}],"rom_address":3307778},"rom_address":3297672,"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[63,0],"base_stats":[95,60,79,81,100,125],"catch_rate":60,"evolutions":[],"friendship":70,"id":329,"learnset":{"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}],"rom_address":3307792},"rom_address":3297700,"tmhm_learnset":"03101E00845B7264","types":[11,11]},{"abilities":[24,0],"base_stats":[45,90,20,65,65,20],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":30,"species":331}],"friendship":35,"id":330,"learnset":{"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}],"rom_address":3307822},"rom_address":3297728,"tmhm_learnset":"03103F0084133A64","types":[11,17]},{"abilities":[24,0],"base_stats":[70,120,40,95,95,40],"catch_rate":60,"evolutions":[],"friendship":35,"id":331,"learnset":{"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}],"rom_address":3307848},"rom_address":3297756,"tmhm_learnset":"03B03F4086137A74","types":[11,17]},{"abilities":[52,71],"base_stats":[45,100,45,10,45,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":333}],"friendship":70,"id":332,"learnset":{"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}],"rom_address":3307878},"rom_address":3297784,"tmhm_learnset":"00A01E508E354620","types":[4,4]},{"abilities":[26,26],"base_stats":[50,70,50,70,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":45,"species":334}],"friendship":70,"id":333,"learnset":{"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}],"rom_address":3307902},"rom_address":3297812,"tmhm_learnset":"00A85E508E354620","types":[4,16]},{"abilities":[26,26],"base_stats":[80,100,80,100,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":334,"learnset":{"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}],"rom_address":3307928},"rom_address":3297840,"tmhm_learnset":"00A85E748E754622","types":[4,16]},{"abilities":[47,62],"base_stats":[72,60,30,25,20,30],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":24,"species":336}],"friendship":70,"id":335,"learnset":{"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}],"rom_address":3307954},"rom_address":3297868,"tmhm_learnset":"00B01E40CE1306A1","types":[1,1]},{"abilities":[47,62],"base_stats":[144,120,60,50,40,60],"catch_rate":200,"evolutions":[],"friendship":70,"id":336,"learnset":{"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}],"rom_address":3307986},"rom_address":3297896,"tmhm_learnset":"00B01E40CE1346A1","types":[1,1]},{"abilities":[9,31],"base_stats":[40,45,40,65,65,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":26,"species":338}],"friendship":70,"id":337,"learnset":{"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}],"rom_address":3308018},"rom_address":3297924,"tmhm_learnset":"00603E0285D30230","types":[13,13]},{"abilities":[9,31],"base_stats":[70,75,60,105,105,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":338,"learnset":{"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}],"rom_address":3308048},"rom_address":3297952,"tmhm_learnset":"00603E0285D34230","types":[13,13]},{"abilities":[12,0],"base_stats":[60,60,40,35,65,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":33,"species":340}],"friendship":70,"id":339,"learnset":{"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}],"rom_address":3308078},"rom_address":3297980,"tmhm_learnset":"00A21E748E110620","types":[10,4]},{"abilities":[40,0],"base_stats":[70,100,70,40,105,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":340,"learnset":{"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}],"rom_address":3308104},"rom_address":3298008,"tmhm_learnset":"00A21E748E114630","types":[10,4]},{"abilities":[47,0],"base_stats":[70,40,50,25,55,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":342}],"friendship":70,"id":341,"learnset":{"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}],"rom_address":3308132},"rom_address":3298036,"tmhm_learnset":"03B01E4086533264","types":[15,11]},{"abilities":[47,0],"base_stats":[90,60,70,45,75,70],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":44,"species":343}],"friendship":70,"id":342,"learnset":{"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}],"rom_address":3308160},"rom_address":3298064,"tmhm_learnset":"03B01E4086533274","types":[15,11]},{"abilities":[47,0],"base_stats":[110,80,90,65,95,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":343,"learnset":{"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}],"rom_address":3308188},"rom_address":3298092,"tmhm_learnset":"03B01E4086537274","types":[15,11]},{"abilities":[8,0],"base_stats":[50,85,40,35,85,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":32,"species":345}],"friendship":35,"id":344,"learnset":{"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}],"rom_address":3308216},"rom_address":3298120,"tmhm_learnset":"00441E1084350721","types":[12,12]},{"abilities":[8,0],"base_stats":[70,115,60,55,115,60],"catch_rate":60,"evolutions":[],"friendship":35,"id":345,"learnset":{"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}],"rom_address":3308248},"rom_address":3298148,"tmhm_learnset":"00641E1084354721","types":[12,17]},{"abilities":[39,0],"base_stats":[50,50,50,50,50,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":42,"species":347}],"friendship":70,"id":346,"learnset":{"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}],"rom_address":3308280},"rom_address":3298176,"tmhm_learnset":"00401E00A41BB264","types":[15,15]},{"abilities":[39,0],"base_stats":[80,80,80,80,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":347,"learnset":{"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}],"rom_address":3308308},"rom_address":3298204,"tmhm_learnset":"00401F00A61BFA64","types":[15,15]},{"abilities":[26,0],"base_stats":[70,55,65,70,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":348,"learnset":{"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}],"rom_address":3308338},"rom_address":3298232,"tmhm_learnset":"00408E51B61BD228","types":[5,14]},{"abilities":[26,0],"base_stats":[70,95,85,70,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":349,"learnset":{"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}],"rom_address":3308364},"rom_address":3298260,"tmhm_learnset":"00428E75B639C628","types":[5,14]},{"abilities":[47,37],"base_stats":[50,20,40,20,20,40],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":183}],"friendship":70,"id":350,"learnset":{"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}],"rom_address":3308390},"rom_address":3298288,"tmhm_learnset":"01101E0084533264","types":[0,0]},{"abilities":[47,20],"base_stats":[60,25,35,60,70,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":352}],"friendship":70,"id":351,"learnset":{"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}],"rom_address":3308410},"rom_address":3298316,"tmhm_learnset":"0041BF03B4538E28","types":[14,14]},{"abilities":[47,20],"base_stats":[80,45,65,80,90,110],"catch_rate":60,"evolutions":[],"friendship":70,"id":352,"learnset":{"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}],"rom_address":3308440},"rom_address":3298344,"tmhm_learnset":"0041BF03B453CE29","types":[14,14]},{"abilities":[57,0],"base_stats":[60,50,40,95,85,75],"catch_rate":200,"evolutions":[],"friendship":70,"id":353,"learnset":{"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}],"rom_address":3308470},"rom_address":3298372,"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[58,0],"base_stats":[60,40,50,95,75,85],"catch_rate":200,"evolutions":[],"friendship":70,"id":354,"learnset":{"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}],"rom_address":3308500},"rom_address":3298400,"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[52,22],"base_stats":[50,85,85,50,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":355,"learnset":{"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}],"rom_address":3308530},"rom_address":3298428,"tmhm_learnset":"00A01F7CC4335E21","types":[8,8]},{"abilities":[74,0],"base_stats":[30,40,55,60,40,55],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":37,"species":357}],"friendship":70,"id":356,"learnset":{"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}],"rom_address":3308562},"rom_address":3298456,"tmhm_learnset":"00E01E41F41386A9","types":[1,14]},{"abilities":[74,0],"base_stats":[60,60,75,80,60,75],"catch_rate":90,"evolutions":[],"friendship":70,"id":357,"learnset":{"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}],"rom_address":3308592},"rom_address":3298484,"tmhm_learnset":"00E01E41F413C6A9","types":[1,14]},{"abilities":[30,0],"base_stats":[45,40,60,50,40,75],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":359}],"friendship":70,"id":358,"learnset":{"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}],"rom_address":3308628},"rom_address":3298512,"tmhm_learnset":"00087E80843B1620","types":[0,2]},{"abilities":[30,0],"base_stats":[75,70,90,80,70,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":359,"learnset":{"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}],"rom_address":3308656},"rom_address":3298540,"tmhm_learnset":"00887EA4867B5632","types":[16,2]},{"abilities":[23,0],"base_stats":[95,23,48,23,23,48],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":15,"species":202}],"friendship":70,"id":360,"learnset":{"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}],"rom_address":3308688},"rom_address":3298568,"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[26,0],"base_stats":[20,40,90,25,30,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":362}],"friendship":35,"id":361,"learnset":{"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}],"rom_address":3308706},"rom_address":3298596,"tmhm_learnset":"0041BF00B4133E28","types":[7,7]},{"abilities":[46,0],"base_stats":[40,70,130,25,60,130],"catch_rate":90,"evolutions":[],"friendship":35,"id":362,"learnset":{"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}],"rom_address":3308734},"rom_address":3298624,"tmhm_learnset":"00E1BF40B6137E29","types":[7,7]},{"abilities":[30,38],"base_stats":[50,60,45,65,100,80],"catch_rate":150,"evolutions":[],"friendship":70,"id":363,"learnset":{"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}],"rom_address":3308764},"rom_address":3298652,"tmhm_learnset":"00441E08A4350720","types":[12,3]},{"abilities":[54,0],"base_stats":[60,60,60,30,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":365}],"friendship":70,"id":364,"learnset":{"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}],"rom_address":3308802},"rom_address":3298680,"tmhm_learnset":"00A41EA6E5B336A5","types":[0,0]},{"abilities":[72,0],"base_stats":[80,80,80,90,55,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":366}],"friendship":70,"id":365,"learnset":{"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}],"rom_address":3308826},"rom_address":3298708,"tmhm_learnset":"00A41EA6E7B33EB5","types":[0,0]},{"abilities":[54,0],"base_stats":[150,160,100,100,95,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":366,"learnset":{"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}],"rom_address":3308852},"rom_address":3298736,"tmhm_learnset":"00A41EA6E7B37EB5","types":[0,0]},{"abilities":[64,60],"base_stats":[70,43,53,40,43,53],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":26,"species":368}],"friendship":70,"id":367,"learnset":{"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}],"rom_address":3308878},"rom_address":3298764,"tmhm_learnset":"00A11E0AA4371724","types":[3,3]},{"abilities":[64,60],"base_stats":[100,73,83,55,73,83],"catch_rate":75,"evolutions":[],"friendship":70,"id":368,"learnset":{"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}],"rom_address":3308908},"rom_address":3298792,"tmhm_learnset":"00A11E0AA4375724","types":[3,3]},{"abilities":[34,0],"base_stats":[99,68,83,51,72,87],"catch_rate":200,"evolutions":[],"friendship":70,"id":369,"learnset":{"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}],"rom_address":3308940},"rom_address":3298820,"tmhm_learnset":"00EC5E80863D4730","types":[12,2]},{"abilities":[43,0],"base_stats":[64,51,23,28,51,23],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":20,"species":371}],"friendship":70,"id":370,"learnset":{"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}],"rom_address":3308968},"rom_address":3298848,"tmhm_learnset":"00001E26A4333634","types":[0,0]},{"abilities":[43,0],"base_stats":[84,71,43,48,71,43],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":40,"species":372}],"friendship":70,"id":371,"learnset":{"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}],"rom_address":3308998},"rom_address":3298876,"tmhm_learnset":"00A21F26E6333E34","types":[0,0]},{"abilities":[43,0],"base_stats":[104,91,63,68,91,63],"catch_rate":45,"evolutions":[],"friendship":70,"id":372,"learnset":{"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}],"rom_address":3309028},"rom_address":3298904,"tmhm_learnset":"00A21F26E6337E34","types":[0,0]},{"abilities":[75,0],"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":{"moves":[{"level":1,"move_id":128},{"level":1,"move_id":55},{"level":1,"move_id":250},{"level":1,"move_id":334}],"rom_address":3309060},"rom_address":3298932,"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,0],"base_stats":[55,104,105,52,94,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":374,"learnset":{"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}],"rom_address":3309070},"rom_address":3298960,"tmhm_learnset":"03111E4084137264","types":[11,11]},{"abilities":[33,0],"base_stats":[55,84,105,52,114,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":375,"learnset":{"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}],"rom_address":3309094},"rom_address":3298988,"tmhm_learnset":"03101E00B41B7264","types":[11,11]},{"abilities":[46,0],"base_stats":[65,130,60,75,75,60],"catch_rate":30,"evolutions":[],"friendship":35,"id":376,"learnset":{"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}],"rom_address":3309118},"rom_address":3299016,"tmhm_learnset":"00E53FB6A5D37E6C","types":[17,17]},{"abilities":[15,0],"base_stats":[44,75,35,45,63,33],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":37,"species":378}],"friendship":35,"id":377,"learnset":{"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}],"rom_address":3309148},"rom_address":3299044,"tmhm_learnset":"0041BF02B5930E28","types":[7,7]},{"abilities":[15,0],"base_stats":[64,115,65,65,83,63],"catch_rate":45,"evolutions":[],"friendship":35,"id":378,"learnset":{"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}],"rom_address":3309176},"rom_address":3299072,"tmhm_learnset":"0041BF02B5934E28","types":[7,7]},{"abilities":[61,0],"base_stats":[73,100,60,65,100,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":379,"learnset":{"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}],"rom_address":3309204},"rom_address":3299100,"tmhm_learnset":"00A13E0C8E570E20","types":[3,3]},{"abilities":[17,0],"base_stats":[73,115,60,90,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":380,"learnset":{"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}],"rom_address":3309232},"rom_address":3299128,"tmhm_learnset":"00A03EA6EDF73E35","types":[0,0]},{"abilities":[33,69],"base_stats":[100,90,130,55,45,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":381,"learnset":{"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}],"rom_address":3309262},"rom_address":3299156,"tmhm_learnset":"03901E50861B726C","types":[11,5]},{"abilities":[5,69],"base_stats":[50,70,100,30,40,40],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":32,"species":383}],"friendship":35,"id":382,"learnset":{"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}],"rom_address":3309290},"rom_address":3299184,"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"base_stats":[60,90,140,40,50,50],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":42,"species":384}],"friendship":35,"id":383,"learnset":{"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}],"rom_address":3309322},"rom_address":3299212,"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"base_stats":[70,110,180,50,60,60],"catch_rate":45,"evolutions":[],"friendship":35,"id":384,"learnset":{"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}],"rom_address":3309354},"rom_address":3299240,"tmhm_learnset":"00B41EF6CFF37E37","types":[8,5]},{"abilities":[59,0],"base_stats":[70,70,70,70,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":385,"learnset":{"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}],"rom_address":3309386},"rom_address":3299268,"tmhm_learnset":"00403E36A5B33664","types":[0,0]},{"abilities":[35,68],"base_stats":[65,73,55,85,47,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":386,"learnset":{"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}],"rom_address":3309410},"rom_address":3299296,"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[12,0],"base_stats":[65,47,55,85,73,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":387,"learnset":{"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}],"rom_address":3309438},"rom_address":3299324,"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[21,0],"base_stats":[66,41,77,23,61,87],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":389}],"friendship":70,"id":388,"learnset":{"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}],"rom_address":3309466},"rom_address":3299352,"tmhm_learnset":"00001E1884350720","types":[5,12]},{"abilities":[21,0],"base_stats":[86,81,97,43,81,107],"catch_rate":45,"evolutions":[],"friendship":70,"id":389,"learnset":{"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}],"rom_address":3309494},"rom_address":3299380,"tmhm_learnset":"00A01E5886354720","types":[5,12]},{"abilities":[4,0],"base_stats":[45,95,50,75,40,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":391}],"friendship":70,"id":390,"learnset":{"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}],"rom_address":3309522},"rom_address":3299408,"tmhm_learnset":"00841ED0CC110624","types":[5,6]},{"abilities":[4,0],"base_stats":[75,125,100,45,70,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":391,"learnset":{"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}],"rom_address":3309550},"rom_address":3299436,"tmhm_learnset":"00A41ED0CE514624","types":[5,6]},{"abilities":[28,36],"base_stats":[28,25,25,40,45,35],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":20,"species":393}],"friendship":35,"id":392,"learnset":{"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}],"rom_address":3309578},"rom_address":3299464,"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"base_stats":[38,35,35,50,65,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":394}],"friendship":35,"id":393,"learnset":{"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}],"rom_address":3309606},"rom_address":3299492,"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"base_stats":[68,65,65,80,125,115],"catch_rate":45,"evolutions":[],"friendship":35,"id":394,"learnset":{"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}],"rom_address":3309634},"rom_address":3299520,"tmhm_learnset":"0041BF03B49BCE28","types":[14,14]},{"abilities":[69,0],"base_stats":[45,75,60,50,40,30],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":396}],"friendship":35,"id":395,"learnset":{"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}],"rom_address":3309662},"rom_address":3299548,"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[69,0],"base_stats":[65,95,100,50,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":50,"species":397}],"friendship":35,"id":396,"learnset":{"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}],"rom_address":3309692},"rom_address":3299576,"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[22,0],"base_stats":[95,135,80,100,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":397,"learnset":{"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}],"rom_address":3309724},"rom_address":3299604,"tmhm_learnset":"00AC5EE4C6534632","types":[16,2]},{"abilities":[29,0],"base_stats":[40,55,80,30,35,60],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":20,"species":399}],"friendship":35,"id":398,"learnset":{"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36}],"rom_address":3309758},"rom_address":3299632,"tmhm_learnset":"0000000000000000","types":[8,14]},{"abilities":[29,0],"base_stats":[60,75,100,50,55,80],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":45,"species":400}],"friendship":35,"id":399,"learnset":{"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}],"rom_address":3309768},"rom_address":3299660,"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"base_stats":[80,135,130,70,95,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":400,"learnset":{"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}],"rom_address":3309796},"rom_address":3299688,"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"base_stats":[80,100,200,50,50,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":401,"learnset":{"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}],"rom_address":3309824},"rom_address":3299716,"tmhm_learnset":"00A00E52CF994621","types":[5,5]},{"abilities":[29,0],"base_stats":[80,50,100,50,100,200],"catch_rate":3,"evolutions":[],"friendship":35,"id":402,"learnset":{"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}],"rom_address":3309850},"rom_address":3299744,"tmhm_learnset":"00A00E02C79B7261","types":[15,15]},{"abilities":[29,0],"base_stats":[80,75,150,50,75,150],"catch_rate":3,"evolutions":[],"friendship":35,"id":403,"learnset":{"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}],"rom_address":3309876},"rom_address":3299772,"tmhm_learnset":"00A00ED2C79B4621","types":[8,8]},{"abilities":[2,0],"base_stats":[100,100,90,90,150,140],"catch_rate":5,"evolutions":[],"friendship":0,"id":404,"learnset":{"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}],"rom_address":3309904},"rom_address":3299800,"tmhm_learnset":"03B00E42C79B727C","types":[11,11]},{"abilities":[70,0],"base_stats":[100,150,140,90,100,90],"catch_rate":5,"evolutions":[],"friendship":0,"id":405,"learnset":{"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}],"rom_address":3309934},"rom_address":3299828,"tmhm_learnset":"00A60EF6CFF946B2","types":[4,4]},{"abilities":[77,0],"base_stats":[105,150,90,95,150,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":406,"learnset":{"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}],"rom_address":3309964},"rom_address":3299856,"tmhm_learnset":"03BA0EB6C7F376B6","types":[16,2]},{"abilities":[26,0],"base_stats":[80,80,90,110,110,130],"catch_rate":3,"evolutions":[],"friendship":90,"id":407,"learnset":{"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}],"rom_address":3309994},"rom_address":3299884,"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[26,0],"base_stats":[80,90,80,110,130,110],"catch_rate":3,"evolutions":[],"friendship":90,"id":408,"learnset":{"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}],"rom_address":3310024},"rom_address":3299912,"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[32,0],"base_stats":[100,100,100,100,100,100],"catch_rate":3,"evolutions":[],"friendship":100,"id":409,"learnset":{"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}],"rom_address":3310054},"rom_address":3299940,"tmhm_learnset":"00408E93B59BC62C","types":[8,14]},{"abilities":[46,0],"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":410,"learnset":{"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}],"rom_address":3310084},"rom_address":3299968,"tmhm_learnset":"00E58FC3F5BBDE2D","types":[14,14]},{"abilities":[26,0],"base_stats":[65,50,70,65,95,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":411,"learnset":{"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}],"rom_address":3310114},"rom_address":3299996,"tmhm_learnset":"00419F03B41B8E28","types":[14,14]}],"static_encounters":[{"flag":33,"level":50,"rom_address":2379222,"species":407},{"flag":32,"level":50,"rom_address":2379215,"species":408},{"flag":977,"level":30,"rom_address":2316785,"species":101},{"flag":978,"level":30,"rom_address":2316862,"species":101},{"flag":842,"level":40,"rom_address":2379579,"species":185},{"flag":763,"level":30,"rom_address":2531937,"species":410},{"flag":801,"level":70,"rom_address":2536492,"species":250},{"flag":800,"level":70,"rom_address":2536772,"species":249},{"flag":782,"level":70,"rom_address":2347550,"species":404},{"flag":718,"level":30,"rom_address":2531517,"species":151},{"flag":974,"level":25,"rom_address":2332864,"species":100},{"flag":975,"level":25,"rom_address":2332941,"species":100},{"flag":976,"level":25,"rom_address":2333018,"species":100},{"flag":936,"level":40,"rom_address":2338991,"species":402},{"flag":935,"level":40,"rom_address":2291862,"species":401},{"flag":937,"level":40,"rom_address":2339249,"species":403},{"flag":989,"level":30,"rom_address":2573968,"species":317},{"flag":990,"level":30,"rom_address":2573987,"species":317},{"flag":982,"level":30,"rom_address":2573873,"species":317},{"flag":985,"level":30,"rom_address":2573892,"species":317},{"flag":986,"level":30,"rom_address":2573911,"species":317},{"flag":987,"level":30,"rom_address":2573930,"species":317},{"flag":988,"level":30,"rom_address":2573949,"species":317},{"flag":970,"level":30,"rom_address":2059073,"species":317},{"flag":80,"level":70,"rom_address":2340984,"species":406},{"flag":783,"level":70,"rom_address":2347759,"species":405}],"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":[{"battle_script_rom_address":0,"party":[],"party_rom_address":4160749568,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3221820},{"battle_script_rom_address":2298147,"party":[{"level":21,"moves":[0,0,0,0],"species":74}],"party_rom_address":3202872,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3221860},{"battle_script_rom_address":2315511,"party":[{"level":32,"moves":[0,0,0,0],"species":286}],"party_rom_address":3202880,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3221900},{"battle_script_rom_address":2316936,"party":[{"level":31,"moves":[0,0,0,0],"species":41},{"level":31,"moves":[0,0,0,0],"species":330}],"party_rom_address":3202888,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3221940},{"battle_script_rom_address":2316983,"party":[{"level":32,"moves":[0,0,0,0],"species":41}],"party_rom_address":3202904,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3221980},{"battle_script_rom_address":2317996,"party":[{"level":32,"moves":[0,0,0,0],"species":330}],"party_rom_address":3202912,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222020},{"battle_script_rom_address":2320418,"party":[{"level":36,"moves":[0,0,0,0],"species":286}],"party_rom_address":3202920,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222060},{"battle_script_rom_address":2320449,"party":[{"level":36,"moves":[0,0,0,0],"species":330}],"party_rom_address":3202928,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222100},{"battle_script_rom_address":2321650,"party":[{"level":36,"moves":[0,0,0,0],"species":41}],"party_rom_address":3202936,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222140},{"battle_script_rom_address":2307885,"party":[{"level":26,"moves":[0,0,0,0],"species":315},{"level":26,"moves":[0,0,0,0],"species":286},{"level":26,"moves":[0,0,0,0],"species":288},{"level":26,"moves":[0,0,0,0],"species":295},{"level":26,"moves":[0,0,0,0],"species":298},{"level":26,"moves":[0,0,0,0],"species":304}],"party_rom_address":3202944,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222180},{"battle_script_rom_address":0,"party":[{"level":9,"moves":[0,0,0,0],"species":286}],"party_rom_address":3202992,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222220},{"battle_script_rom_address":2061615,"party":[{"level":29,"moves":[0,0,0,0],"species":338},{"level":29,"moves":[0,0,0,0],"species":300}],"party_rom_address":3203000,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222260},{"battle_script_rom_address":2062556,"party":[{"level":30,"moves":[0,0,0,0],"species":310},{"level":30,"moves":[0,0,0,0],"species":178}],"party_rom_address":3203016,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222300},{"battle_script_rom_address":2062587,"party":[{"level":30,"moves":[0,0,0,0],"species":380},{"level":30,"moves":[0,0,0,0],"species":379}],"party_rom_address":3203032,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222340},{"battle_script_rom_address":2321681,"party":[{"level":36,"moves":[0,0,0,0],"species":330}],"party_rom_address":3203048,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222380},{"battle_script_rom_address":2063653,"party":[{"level":34,"moves":[0,0,0,0],"species":130}],"party_rom_address":3203056,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222420},{"battle_script_rom_address":0,"party":[{"level":11,"moves":[0,0,0,0],"species":286}],"party_rom_address":3203064,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222460},{"battle_script_rom_address":2563645,"party":[{"level":27,"moves":[0,0,0,0],"species":41},{"level":27,"moves":[0,0,0,0],"species":286}],"party_rom_address":3203072,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222500},{"battle_script_rom_address":2564779,"party":[{"level":27,"moves":[0,0,0,0],"species":286},{"level":27,"moves":[0,0,0,0],"species":330}],"party_rom_address":3203088,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222540},{"battle_script_rom_address":2564810,"party":[{"level":26,"moves":[0,0,0,0],"species":286},{"level":26,"moves":[0,0,0,0],"species":41},{"level":26,"moves":[0,0,0,0],"species":330}],"party_rom_address":3203104,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222580},{"battle_script_rom_address":2151814,"party":[{"level":15,"moves":[0,0,0,0],"species":330}],"party_rom_address":3203128,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222620},{"battle_script_rom_address":2151873,"party":[{"level":14,"moves":[0,0,0,0],"species":41},{"level":14,"moves":[0,0,0,0],"species":330}],"party_rom_address":3203136,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222660},{"battle_script_rom_address":2248406,"party":[{"level":32,"moves":[0,0,0,0],"species":339}],"party_rom_address":3203152,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222700},{"battle_script_rom_address":2311132,"party":[{"level":32,"moves":[0,0,0,0],"species":41}],"party_rom_address":3203160,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222740},{"battle_script_rom_address":2311163,"party":[{"level":32,"moves":[0,0,0,0],"species":330}],"party_rom_address":3203168,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222780},{"battle_script_rom_address":2311194,"party":[{"level":30,"moves":[0,0,0,0],"species":286},{"level":30,"moves":[0,0,0,0],"species":330}],"party_rom_address":3203176,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222820},{"battle_script_rom_address":2563676,"party":[{"level":28,"moves":[0,0,0,0],"species":330}],"party_rom_address":3203192,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222860},{"battle_script_rom_address":2317024,"party":[{"level":32,"moves":[0,0,0,0],"species":330}],"party_rom_address":3203200,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222900},{"battle_script_rom_address":2318037,"party":[{"level":32,"moves":[0,0,0,0],"species":41}],"party_rom_address":3203208,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222940},{"battle_script_rom_address":2062525,"party":[{"level":30,"moves":[0,0,0,0],"species":335},{"level":30,"moves":[0,0,0,0],"species":67}],"party_rom_address":3203216,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3222980},{"battle_script_rom_address":2317860,"party":[{"level":34,"moves":[0,0,0,0],"species":287},{"level":34,"moves":[0,0,0,0],"species":42}],"party_rom_address":3203232,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223020},{"battle_script_rom_address":2306336,"party":[{"level":31,"moves":[0,0,0,0],"species":336}],"party_rom_address":3203248,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223060},{"battle_script_rom_address":2564841,"party":[{"level":28,"moves":[0,0,0,0],"species":330},{"level":28,"moves":[0,0,0,0],"species":287}],"party_rom_address":3203256,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223100},{"battle_script_rom_address":2320766,"party":[{"level":37,"moves":[0,0,0,0],"species":331},{"level":37,"moves":[0,0,0,0],"species":287}],"party_rom_address":3203272,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223140},{"battle_script_rom_address":2322088,"party":[{"level":41,"moves":[0,0,0,0],"species":287},{"level":41,"moves":[0,0,0,0],"species":169},{"level":43,"moves":[0,0,0,0],"species":331}],"party_rom_address":3203288,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223180},{"battle_script_rom_address":2306305,"party":[{"level":31,"moves":[0,0,0,0],"species":351}],"party_rom_address":3203312,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223220},{"battle_script_rom_address":2020252,"party":[{"level":14,"moves":[0,0,0,0],"species":306},{"level":14,"moves":[0,0,0,0],"species":363}],"party_rom_address":3203320,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223260},{"battle_script_rom_address":2052806,"party":[{"level":14,"moves":[0,0,0,0],"species":363},{"level":14,"moves":[0,0,0,0],"species":306},{"level":14,"moves":[0,0,0,0],"species":363}],"party_rom_address":3203336,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223300},{"battle_script_rom_address":2329135,"party":[{"level":43,"moves":[94,0,0,0],"species":357},{"level":43,"moves":[29,89,0,0],"species":319}],"party_rom_address":3203360,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3223340},{"battle_script_rom_address":2062181,"party":[{"level":26,"moves":[0,0,0,0],"species":363},{"level":26,"moves":[0,0,0,0],"species":44}],"party_rom_address":3203392,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223380},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":306},{"level":26,"moves":[0,0,0,0],"species":363}],"party_rom_address":3203408,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223420},{"battle_script_rom_address":0,"party":[{"level":28,"moves":[0,0,0,0],"species":306},{"level":28,"moves":[0,0,0,0],"species":44},{"level":28,"moves":[0,0,0,0],"species":363}],"party_rom_address":3203424,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223460},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":306},{"level":31,"moves":[0,0,0,0],"species":44},{"level":31,"moves":[0,0,0,0],"species":363}],"party_rom_address":3203448,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223500},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":307},{"level":34,"moves":[0,0,0,0],"species":44},{"level":34,"moves":[0,0,0,0],"species":363}],"party_rom_address":3203472,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223540},{"battle_script_rom_address":2040619,"party":[{"level":23,"moves":[91,163,28,40],"species":28}],"party_rom_address":3203496,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3223580},{"battle_script_rom_address":2059717,"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_rom_address":3203512,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3223620},{"battle_script_rom_address":2027714,"party":[{"level":25,"moves":[91,163,28,40],"species":27},{"level":25,"moves":[91,163,28,40],"species":28}],"party_rom_address":3203560,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3223660},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[91,163,28,40],"species":28}],"party_rom_address":3203592,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3223700},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[91,163,28,40],"species":28}],"party_rom_address":3203608,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3223740},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[91,163,28,40],"species":28}],"party_rom_address":3203624,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3223780},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[91,163,28,40],"species":28}],"party_rom_address":3203640,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3223820},{"battle_script_rom_address":0,"party":[{"level":17,"moves":[0,0,0,0],"species":81},{"level":17,"moves":[0,0,0,0],"species":370}],"party_rom_address":3203656,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223860},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[0,0,0,0],"species":81},{"level":27,"moves":[0,0,0,0],"species":371}],"party_rom_address":3203672,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223900},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":82},{"level":30,"moves":[0,0,0,0],"species":371}],"party_rom_address":3203688,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223940},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":82},{"level":33,"moves":[0,0,0,0],"species":371}],"party_rom_address":3203704,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3223980},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[0,0,0,0],"species":82},{"level":36,"moves":[0,0,0,0],"species":371}],"party_rom_address":3203720,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224020},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[49,86,63,85],"species":82},{"level":39,"moves":[54,23,48,48],"species":372}],"party_rom_address":3203736,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3224060},{"battle_script_rom_address":2030183,"party":[{"level":12,"moves":[0,0,0,0],"species":350},{"level":12,"moves":[0,0,0,0],"species":350}],"party_rom_address":3203768,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224100},{"battle_script_rom_address":2030293,"party":[{"level":26,"moves":[0,0,0,0],"species":183}],"party_rom_address":3203784,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224140},{"battle_script_rom_address":2030324,"party":[{"level":26,"moves":[0,0,0,0],"species":183}],"party_rom_address":3203792,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224180},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":183},{"level":26,"moves":[0,0,0,0],"species":183}],"party_rom_address":3203800,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224220},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":183},{"level":29,"moves":[0,0,0,0],"species":183}],"party_rom_address":3203816,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224260},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":183},{"level":32,"moves":[0,0,0,0],"species":183}],"party_rom_address":3203832,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224300},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":184},{"level":35,"moves":[0,0,0,0],"species":184}],"party_rom_address":3203848,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224340},{"battle_script_rom_address":2030073,"party":[{"level":13,"moves":[28,29,39,57],"species":288}],"party_rom_address":3203864,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3224380},{"battle_script_rom_address":2537320,"party":[{"level":12,"moves":[0,0,0,0],"species":350},{"level":12,"moves":[0,0,0,0],"species":183}],"party_rom_address":3203880,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224420},{"battle_script_rom_address":2333372,"party":[{"level":26,"moves":[0,0,0,0],"species":183}],"party_rom_address":3203896,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224460},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[28,42,39,57],"species":289}],"party_rom_address":3203904,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3224500},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[28,42,39,57],"species":289}],"party_rom_address":3203920,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3224540},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[28,42,39,57],"species":289}],"party_rom_address":3203936,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3224580},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[28,42,39,57],"species":289}],"party_rom_address":3203952,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3224620},{"battle_script_rom_address":2125121,"party":[{"level":26,"moves":[98,97,17,0],"species":305}],"party_rom_address":3203968,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3224660},{"battle_script_rom_address":2125185,"party":[{"level":26,"moves":[42,146,8,0],"species":308}],"party_rom_address":3203984,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3224700},{"battle_script_rom_address":2125249,"party":[{"level":26,"moves":[47,68,247,0],"species":364}],"party_rom_address":3204000,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3224740},{"battle_script_rom_address":2125313,"party":[{"level":26,"moves":[116,163,0,0],"species":365}],"party_rom_address":3204016,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3224780},{"battle_script_rom_address":2062150,"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_rom_address":3204032,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3224820},{"battle_script_rom_address":2558747,"party":[{"level":44,"moves":[0,0,0,0],"species":322},{"level":44,"moves":[0,0,0,0],"species":357},{"level":44,"moves":[0,0,0,0],"species":331}],"party_rom_address":3204112,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224860},{"battle_script_rom_address":2558809,"party":[{"level":46,"moves":[0,0,0,0],"species":355},{"level":46,"moves":[0,0,0,0],"species":121}],"party_rom_address":3204136,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224900},{"battle_script_rom_address":2040822,"party":[{"level":17,"moves":[0,0,0,0],"species":337},{"level":17,"moves":[0,0,0,0],"species":313},{"level":17,"moves":[0,0,0,0],"species":335}],"party_rom_address":3204152,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224940},{"battle_script_rom_address":2326273,"party":[{"level":43,"moves":[0,0,0,0],"species":345},{"level":43,"moves":[0,0,0,0],"species":310}],"party_rom_address":3204176,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3224980},{"battle_script_rom_address":2326304,"party":[{"level":43,"moves":[0,0,0,0],"species":82},{"level":43,"moves":[0,0,0,0],"species":89}],"party_rom_address":3204192,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225020},{"battle_script_rom_address":2327963,"party":[{"level":42,"moves":[0,0,0,0],"species":305},{"level":42,"moves":[0,0,0,0],"species":355},{"level":42,"moves":[0,0,0,0],"species":64}],"party_rom_address":3204208,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225060},{"battle_script_rom_address":2329011,"party":[{"level":42,"moves":[0,0,0,0],"species":85},{"level":42,"moves":[0,0,0,0],"species":64},{"level":42,"moves":[0,0,0,0],"species":101},{"level":42,"moves":[0,0,0,0],"species":300}],"party_rom_address":3204232,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225100},{"battle_script_rom_address":2329042,"party":[{"level":42,"moves":[0,0,0,0],"species":317},{"level":42,"moves":[0,0,0,0],"species":75},{"level":42,"moves":[0,0,0,0],"species":314}],"party_rom_address":3204264,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225140},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":337},{"level":26,"moves":[0,0,0,0],"species":313},{"level":26,"moves":[0,0,0,0],"species":335}],"party_rom_address":3204288,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225180},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":338},{"level":29,"moves":[0,0,0,0],"species":313},{"level":29,"moves":[0,0,0,0],"species":335}],"party_rom_address":3204312,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225220},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":338},{"level":32,"moves":[0,0,0,0],"species":313},{"level":32,"moves":[0,0,0,0],"species":335}],"party_rom_address":3204336,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225260},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":338},{"level":35,"moves":[0,0,0,0],"species":313},{"level":35,"moves":[0,0,0,0],"species":336}],"party_rom_address":3204360,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225300},{"battle_script_rom_address":2067950,"party":[{"level":33,"moves":[0,0,0,0],"species":75},{"level":33,"moves":[0,0,0,0],"species":297}],"party_rom_address":3204384,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225340},{"battle_script_rom_address":2125377,"party":[{"level":26,"moves":[185,95,0,0],"species":316}],"party_rom_address":3204400,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3225380},{"battle_script_rom_address":2125441,"party":[{"level":26,"moves":[111,38,247,0],"species":40}],"party_rom_address":3204416,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3225420},{"battle_script_rom_address":2125505,"party":[{"level":26,"moves":[14,163,0,0],"species":380}],"party_rom_address":3204432,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3225460},{"battle_script_rom_address":2062119,"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_rom_address":3204448,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3225500},{"battle_script_rom_address":2558778,"party":[{"level":45,"moves":[0,0,0,0],"species":383},{"level":45,"moves":[0,0,0,0],"species":338}],"party_rom_address":3204496,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225540},{"battle_script_rom_address":2040932,"party":[{"level":17,"moves":[0,0,0,0],"species":309},{"level":17,"moves":[0,0,0,0],"species":339},{"level":17,"moves":[0,0,0,0],"species":363}],"party_rom_address":3204512,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225580},{"battle_script_rom_address":2059686,"party":[{"level":30,"moves":[0,0,0,0],"species":322}],"party_rom_address":3204536,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225620},{"battle_script_rom_address":2326335,"party":[{"level":45,"moves":[0,0,0,0],"species":363}],"party_rom_address":3204544,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225660},{"battle_script_rom_address":2327994,"party":[{"level":45,"moves":[0,0,0,0],"species":319}],"party_rom_address":3204552,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225700},{"battle_script_rom_address":2328025,"party":[{"level":42,"moves":[0,0,0,0],"species":321},{"level":42,"moves":[0,0,0,0],"species":357},{"level":42,"moves":[0,0,0,0],"species":297}],"party_rom_address":3204560,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225740},{"battle_script_rom_address":2329073,"party":[{"level":43,"moves":[0,0,0,0],"species":227},{"level":43,"moves":[0,0,0,0],"species":322}],"party_rom_address":3204584,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225780},{"battle_script_rom_address":2329104,"party":[{"level":42,"moves":[0,0,0,0],"species":28},{"level":42,"moves":[0,0,0,0],"species":38},{"level":42,"moves":[0,0,0,0],"species":369}],"party_rom_address":3204600,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225820},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":309},{"level":26,"moves":[0,0,0,0],"species":339},{"level":26,"moves":[0,0,0,0],"species":363}],"party_rom_address":3204624,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225860},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":310},{"level":29,"moves":[0,0,0,0],"species":339},{"level":29,"moves":[0,0,0,0],"species":363}],"party_rom_address":3204648,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225900},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":310},{"level":32,"moves":[0,0,0,0],"species":339},{"level":32,"moves":[0,0,0,0],"species":363}],"party_rom_address":3204672,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225940},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":310},{"level":34,"moves":[0,0,0,0],"species":340},{"level":34,"moves":[0,0,0,0],"species":363}],"party_rom_address":3204696,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3225980},{"battle_script_rom_address":2557556,"party":[{"level":41,"moves":[0,0,0,0],"species":378},{"level":41,"moves":[0,0,0,0],"species":348}],"party_rom_address":3204720,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226020},{"battle_script_rom_address":2062494,"party":[{"level":30,"moves":[0,0,0,0],"species":361},{"level":30,"moves":[0,0,0,0],"species":377}],"party_rom_address":3204736,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226060},{"battle_script_rom_address":2061319,"party":[{"level":29,"moves":[0,0,0,0],"species":361},{"level":29,"moves":[0,0,0,0],"species":377}],"party_rom_address":3204752,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226100},{"battle_script_rom_address":2309379,"party":[{"level":32,"moves":[0,0,0,0],"species":322}],"party_rom_address":3204768,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226140},{"battle_script_rom_address":2309166,"party":[{"level":32,"moves":[0,0,0,0],"species":377}],"party_rom_address":3204776,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226180},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":322},{"level":31,"moves":[0,0,0,0],"species":351}],"party_rom_address":3204784,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226220},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":351},{"level":35,"moves":[0,0,0,0],"species":322}],"party_rom_address":3204800,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226260},{"battle_script_rom_address":0,"party":[{"level":40,"moves":[0,0,0,0],"species":351},{"level":40,"moves":[0,0,0,0],"species":322}],"party_rom_address":3204816,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226300},{"battle_script_rom_address":0,"party":[{"level":42,"moves":[0,0,0,0],"species":361},{"level":42,"moves":[0,0,0,0],"species":322},{"level":42,"moves":[0,0,0,0],"species":352}],"party_rom_address":3204832,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226340},{"battle_script_rom_address":2024261,"party":[{"level":7,"moves":[0,0,0,0],"species":288}],"party_rom_address":3204856,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3226380},{"battle_script_rom_address":2259635,"party":[{"level":39,"moves":[213,186,175,96],"species":325},{"level":39,"moves":[213,219,36,96],"species":325}],"party_rom_address":3204864,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3226420},{"battle_script_rom_address":2248487,"party":[{"level":26,"moves":[0,0,0,0],"species":287},{"level":28,"moves":[0,0,0,0],"species":287},{"level":30,"moves":[0,0,0,0],"species":339}],"party_rom_address":3204896,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226460},{"battle_script_rom_address":0,"party":[{"level":11,"moves":[33,39,0,0],"species":288}],"party_rom_address":3204920,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3226500},{"battle_script_rom_address":2259418,"party":[{"level":40,"moves":[0,0,0,0],"species":119}],"party_rom_address":3204936,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3226540},{"battle_script_rom_address":2354429,"party":[{"level":45,"moves":[0,0,0,0],"species":363}],"party_rom_address":3204944,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3226580},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[0,0,0,0],"species":289}],"party_rom_address":3204952,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3226620},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":289}],"party_rom_address":3204960,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3226660},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":289}],"party_rom_address":3204968,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3226700},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_rom_address":3204976,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3226740},{"battle_script_rom_address":2298023,"party":[{"level":21,"moves":[0,0,0,0],"species":183}],"party_rom_address":3204992,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226780},{"battle_script_rom_address":2298054,"party":[{"level":21,"moves":[0,0,0,0],"species":306}],"party_rom_address":3205000,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226820},{"battle_script_rom_address":2298085,"party":[{"level":21,"moves":[0,0,0,0],"species":339}],"party_rom_address":3205008,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226860},{"battle_script_rom_address":2061412,"party":[{"level":29,"moves":[20,122,154,185],"species":317},{"level":29,"moves":[86,103,137,242],"species":379}],"party_rom_address":3205016,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3226900},{"battle_script_rom_address":2259449,"party":[{"level":40,"moves":[0,0,0,0],"species":118}],"party_rom_address":3205048,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226940},{"battle_script_rom_address":2259480,"party":[{"level":40,"moves":[0,0,0,0],"species":184}],"party_rom_address":3205056,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3226980},{"battle_script_rom_address":2259511,"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_rom_address":3205064,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3227020},{"battle_script_rom_address":2259542,"party":[{"level":39,"moves":[0,0,0,0],"species":330},{"level":39,"moves":[0,0,0,0],"species":331}],"party_rom_address":3205112,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227060},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[20,122,154,185],"species":317},{"level":35,"moves":[86,103,137,242],"species":379}],"party_rom_address":3205128,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3227100},{"battle_script_rom_address":0,"party":[{"level":38,"moves":[20,122,154,185],"species":317},{"level":38,"moves":[86,103,137,242],"species":379}],"party_rom_address":3205160,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3227140},{"battle_script_rom_address":0,"party":[{"level":41,"moves":[20,122,154,185],"species":317},{"level":41,"moves":[86,103,137,242],"species":379}],"party_rom_address":3205192,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3227180},{"battle_script_rom_address":0,"party":[{"level":44,"moves":[20,122,154,185],"species":317},{"level":44,"moves":[86,103,137,242],"species":379}],"party_rom_address":3205224,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3227220},{"battle_script_rom_address":2024075,"party":[{"level":7,"moves":[0,0,0,0],"species":288}],"party_rom_address":3205256,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3227260},{"battle_script_rom_address":2068012,"party":[{"level":33,"moves":[0,0,0,0],"species":324},{"level":33,"moves":[0,0,0,0],"species":356}],"party_rom_address":3205264,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227300},{"battle_script_rom_address":2354398,"party":[{"level":45,"moves":[0,0,0,0],"species":184}],"party_rom_address":3205280,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3227340},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[0,0,0,0],"species":289}],"party_rom_address":3205288,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3227380},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":289}],"party_rom_address":3205296,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3227420},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":289}],"party_rom_address":3205304,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3227460},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_rom_address":3205312,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3227500},{"battle_script_rom_address":2046087,"party":[{"level":19,"moves":[0,0,0,0],"species":382}],"party_rom_address":3205328,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227540},{"battle_script_rom_address":2333649,"party":[{"level":25,"moves":[0,0,0,0],"species":313},{"level":25,"moves":[0,0,0,0],"species":116}],"party_rom_address":3205336,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227580},{"battle_script_rom_address":2306212,"party":[{"level":31,"moves":[0,0,0,0],"species":111}],"party_rom_address":3205352,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227620},{"battle_script_rom_address":2298116,"party":[{"level":20,"moves":[0,0,0,0],"species":339}],"party_rom_address":3205360,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227660},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[0,0,0,0],"species":383}],"party_rom_address":3205368,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227700},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":383},{"level":29,"moves":[0,0,0,0],"species":111}],"party_rom_address":3205376,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227740},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":383},{"level":32,"moves":[0,0,0,0],"species":111}],"party_rom_address":3205392,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227780},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":384},{"level":35,"moves":[0,0,0,0],"species":112}],"party_rom_address":3205408,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227820},{"battle_script_rom_address":2027745,"party":[{"level":26,"moves":[0,0,0,0],"species":330}],"party_rom_address":3205424,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227860},{"battle_script_rom_address":2027776,"party":[{"level":26,"moves":[0,0,0,0],"species":72}],"party_rom_address":3205432,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227900},{"battle_script_rom_address":2028359,"party":[{"level":24,"moves":[0,0,0,0],"species":72},{"level":24,"moves":[0,0,0,0],"species":72}],"party_rom_address":3205440,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227940},{"battle_script_rom_address":2028653,"party":[{"level":24,"moves":[0,0,0,0],"species":72},{"level":24,"moves":[0,0,0,0],"species":309},{"level":24,"moves":[0,0,0,0],"species":72}],"party_rom_address":3205456,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3227980},{"battle_script_rom_address":2028684,"party":[{"level":26,"moves":[0,0,0,0],"species":330}],"party_rom_address":3205480,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228020},{"battle_script_rom_address":2028950,"party":[{"level":26,"moves":[0,0,0,0],"species":73}],"party_rom_address":3205488,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228060},{"battle_script_rom_address":2028981,"party":[{"level":26,"moves":[0,0,0,0],"species":330}],"party_rom_address":3205496,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228100},{"battle_script_rom_address":2029949,"party":[{"level":25,"moves":[0,0,0,0],"species":72},{"level":25,"moves":[0,0,0,0],"species":330}],"party_rom_address":3205504,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228140},{"battle_script_rom_address":2063211,"party":[{"level":33,"moves":[0,0,0,0],"species":72},{"level":33,"moves":[0,0,0,0],"species":309}],"party_rom_address":3205520,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228180},{"battle_script_rom_address":2063242,"party":[{"level":34,"moves":[0,0,0,0],"species":330}],"party_rom_address":3205536,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228220},{"battle_script_rom_address":2063822,"party":[{"level":34,"moves":[0,0,0,0],"species":73}],"party_rom_address":3205544,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228260},{"battle_script_rom_address":2063853,"party":[{"level":34,"moves":[0,0,0,0],"species":116}],"party_rom_address":3205552,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228300},{"battle_script_rom_address":2064196,"party":[{"level":34,"moves":[0,0,0,0],"species":130}],"party_rom_address":3205560,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228340},{"battle_script_rom_address":2064227,"party":[{"level":31,"moves":[0,0,0,0],"species":330},{"level":31,"moves":[0,0,0,0],"species":309},{"level":31,"moves":[0,0,0,0],"species":330}],"party_rom_address":3205568,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228380},{"battle_script_rom_address":2067229,"party":[{"level":34,"moves":[0,0,0,0],"species":130}],"party_rom_address":3205592,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228420},{"battle_script_rom_address":2067359,"party":[{"level":34,"moves":[0,0,0,0],"species":310}],"party_rom_address":3205600,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228460},{"battle_script_rom_address":2067390,"party":[{"level":33,"moves":[0,0,0,0],"species":309},{"level":33,"moves":[0,0,0,0],"species":73}],"party_rom_address":3205608,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228500},{"battle_script_rom_address":2067291,"party":[{"level":33,"moves":[0,0,0,0],"species":73},{"level":33,"moves":[0,0,0,0],"species":313}],"party_rom_address":3205624,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228540},{"battle_script_rom_address":2067608,"party":[{"level":34,"moves":[0,0,0,0],"species":331}],"party_rom_address":3205640,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228580},{"battle_script_rom_address":2067857,"party":[{"level":34,"moves":[0,0,0,0],"species":342}],"party_rom_address":3205648,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228620},{"battle_script_rom_address":2067576,"party":[{"level":34,"moves":[0,0,0,0],"species":341}],"party_rom_address":3205656,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228660},{"battle_script_rom_address":2068089,"party":[{"level":34,"moves":[0,0,0,0],"species":130}],"party_rom_address":3205664,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228700},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":72},{"level":33,"moves":[0,0,0,0],"species":309},{"level":33,"moves":[0,0,0,0],"species":73}],"party_rom_address":3205672,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228740},{"battle_script_rom_address":2063414,"party":[{"level":33,"moves":[0,0,0,0],"species":72},{"level":33,"moves":[0,0,0,0],"species":313}],"party_rom_address":3205696,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228780},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":331}],"party_rom_address":3205712,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228820},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":331}],"party_rom_address":3205720,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228860},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":120},{"level":36,"moves":[0,0,0,0],"species":331}],"party_rom_address":3205728,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228900},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":121},{"level":39,"moves":[0,0,0,0],"species":331}],"party_rom_address":3205744,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228940},{"battle_script_rom_address":2089272,"party":[{"level":13,"moves":[0,0,0,0],"species":66}],"party_rom_address":3205760,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3228980},{"battle_script_rom_address":2068213,"party":[{"level":32,"moves":[0,0,0,0],"species":66},{"level":32,"moves":[0,0,0,0],"species":67}],"party_rom_address":3205768,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229020},{"battle_script_rom_address":2067701,"party":[{"level":34,"moves":[0,0,0,0],"species":336}],"party_rom_address":3205784,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229060},{"battle_script_rom_address":2047023,"party":[{"level":24,"moves":[0,0,0,0],"species":66},{"level":28,"moves":[0,0,0,0],"species":67}],"party_rom_address":3205792,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229100},{"battle_script_rom_address":2047054,"party":[{"level":19,"moves":[0,0,0,0],"species":66}],"party_rom_address":3205808,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229140},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[0,0,0,0],"species":67}],"party_rom_address":3205816,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229180},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":66},{"level":29,"moves":[0,0,0,0],"species":67}],"party_rom_address":3205824,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229220},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":66},{"level":31,"moves":[0,0,0,0],"species":67},{"level":31,"moves":[0,0,0,0],"species":67}],"party_rom_address":3205840,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229260},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":66},{"level":33,"moves":[0,0,0,0],"species":67},{"level":33,"moves":[0,0,0,0],"species":67},{"level":33,"moves":[0,0,0,0],"species":68}],"party_rom_address":3205864,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3229300},{"battle_script_rom_address":2550585,"party":[{"level":26,"moves":[0,0,0,0],"species":335},{"level":26,"moves":[0,0,0,0],"species":67}],"party_rom_address":3205896,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229340},{"battle_script_rom_address":2040791,"party":[{"level":19,"moves":[0,0,0,0],"species":66}],"party_rom_address":3205912,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229380},{"battle_script_rom_address":2308993,"party":[{"level":32,"moves":[0,0,0,0],"species":336}],"party_rom_address":3205920,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229420},{"battle_script_rom_address":2161493,"party":[{"level":17,"moves":[98,86,209,43],"species":337},{"level":17,"moves":[12,95,103,0],"species":100}],"party_rom_address":3205928,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3229460},{"battle_script_rom_address":2317055,"party":[{"level":31,"moves":[0,0,0,0],"species":286},{"level":31,"moves":[0,0,0,0],"species":41}],"party_rom_address":3205960,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229500},{"battle_script_rom_address":2318068,"party":[{"level":32,"moves":[0,0,0,0],"species":330}],"party_rom_address":3205976,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229540},{"battle_script_rom_address":2161524,"party":[{"level":17,"moves":[0,0,0,0],"species":100},{"level":17,"moves":[0,0,0,0],"species":81}],"party_rom_address":3205984,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229580},{"battle_script_rom_address":2062742,"party":[{"level":30,"moves":[0,0,0,0],"species":337},{"level":30,"moves":[0,0,0,0],"species":371}],"party_rom_address":3206000,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229620},{"battle_script_rom_address":2052978,"party":[{"level":15,"moves":[0,0,0,0],"species":81},{"level":15,"moves":[0,0,0,0],"species":370}],"party_rom_address":3206016,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229660},{"battle_script_rom_address":0,"party":[{"level":25,"moves":[0,0,0,0],"species":81},{"level":25,"moves":[0,0,0,0],"species":370},{"level":25,"moves":[0,0,0,0],"species":81}],"party_rom_address":3206032,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229700},{"battle_script_rom_address":0,"party":[{"level":28,"moves":[0,0,0,0],"species":81},{"level":28,"moves":[0,0,0,0],"species":371},{"level":28,"moves":[0,0,0,0],"species":81}],"party_rom_address":3206056,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229740},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":82},{"level":31,"moves":[0,0,0,0],"species":371},{"level":31,"moves":[0,0,0,0],"species":82}],"party_rom_address":3206080,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229780},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":82},{"level":34,"moves":[0,0,0,0],"species":372},{"level":34,"moves":[0,0,0,0],"species":82}],"party_rom_address":3206104,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229820},{"battle_script_rom_address":2097377,"party":[{"level":23,"moves":[0,0,0,0],"species":339}],"party_rom_address":3206128,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229860},{"battle_script_rom_address":2097584,"party":[{"level":22,"moves":[0,0,0,0],"species":218},{"level":22,"moves":[0,0,0,0],"species":218}],"party_rom_address":3206136,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229900},{"battle_script_rom_address":2097429,"party":[{"level":23,"moves":[0,0,0,0],"species":339}],"party_rom_address":3206152,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229940},{"battle_script_rom_address":2097553,"party":[{"level":23,"moves":[0,0,0,0],"species":218}],"party_rom_address":3206160,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3229980},{"battle_script_rom_address":2097460,"party":[{"level":23,"moves":[0,0,0,0],"species":218}],"party_rom_address":3206168,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230020},{"battle_script_rom_address":2046197,"party":[{"level":18,"moves":[0,0,0,0],"species":218},{"level":18,"moves":[0,0,0,0],"species":309}],"party_rom_address":3206176,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230060},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":218},{"level":26,"moves":[0,0,0,0],"species":309}],"party_rom_address":3206192,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230100},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":218},{"level":29,"moves":[0,0,0,0],"species":310}],"party_rom_address":3206208,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230140},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":218},{"level":32,"moves":[0,0,0,0],"species":310}],"party_rom_address":3206224,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230180},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":219},{"level":35,"moves":[0,0,0,0],"species":310}],"party_rom_address":3206240,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230220},{"battle_script_rom_address":2040495,"party":[{"level":23,"moves":[91,28,40,163],"species":27}],"party_rom_address":3206256,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3230260},{"battle_script_rom_address":2040557,"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_rom_address":3206272,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3230300},{"battle_script_rom_address":2043958,"party":[{"level":18,"moves":[0,0,0,0],"species":299}],"party_rom_address":3206320,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230340},{"battle_script_rom_address":2046025,"party":[{"level":18,"moves":[0,0,0,0],"species":27},{"level":18,"moves":[0,0,0,0],"species":299}],"party_rom_address":3206328,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230380},{"battle_script_rom_address":2549832,"party":[{"level":24,"moves":[0,0,0,0],"species":317}],"party_rom_address":3206344,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230420},{"battle_script_rom_address":2303835,"party":[{"level":20,"moves":[0,0,0,0],"species":288},{"level":20,"moves":[0,0,0,0],"species":304}],"party_rom_address":3206352,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230460},{"battle_script_rom_address":2303973,"party":[{"level":21,"moves":[0,0,0,0],"species":306}],"party_rom_address":3206368,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230500},{"battle_script_rom_address":2040729,"party":[{"level":18,"moves":[0,0,0,0],"species":27}],"party_rom_address":3206376,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230540},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":288},{"level":26,"moves":[0,0,0,0],"species":304}],"party_rom_address":3206384,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230580},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":289},{"level":29,"moves":[0,0,0,0],"species":305}],"party_rom_address":3206400,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230620},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":27},{"level":31,"moves":[0,0,0,0],"species":305},{"level":31,"moves":[0,0,0,0],"species":289}],"party_rom_address":3206416,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230660},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":305},{"level":34,"moves":[0,0,0,0],"species":28},{"level":34,"moves":[0,0,0,0],"species":289}],"party_rom_address":3206440,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230700},{"battle_script_rom_address":2054989,"party":[{"level":26,"moves":[0,0,0,0],"species":311}],"party_rom_address":3206464,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230740},{"battle_script_rom_address":2055020,"party":[{"level":24,"moves":[0,0,0,0],"species":290},{"level":24,"moves":[0,0,0,0],"species":291},{"level":24,"moves":[0,0,0,0],"species":292}],"party_rom_address":3206472,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230780},{"battle_script_rom_address":2055051,"party":[{"level":27,"moves":[0,0,0,0],"species":290},{"level":27,"moves":[0,0,0,0],"species":293},{"level":27,"moves":[0,0,0,0],"species":294}],"party_rom_address":3206496,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230820},{"battle_script_rom_address":2059576,"party":[{"level":27,"moves":[0,0,0,0],"species":311},{"level":27,"moves":[0,0,0,0],"species":311},{"level":27,"moves":[0,0,0,0],"species":311}],"party_rom_address":3206520,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230860},{"battle_script_rom_address":2051695,"party":[{"level":16,"moves":[0,0,0,0],"species":294},{"level":16,"moves":[0,0,0,0],"species":292}],"party_rom_address":3206544,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230900},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":311},{"level":31,"moves":[0,0,0,0],"species":311},{"level":31,"moves":[0,0,0,0],"species":311}],"party_rom_address":3206560,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230940},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":311},{"level":34,"moves":[0,0,0,0],"species":311},{"level":34,"moves":[0,0,0,0],"species":312}],"party_rom_address":3206584,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3230980},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[0,0,0,0],"species":311},{"level":36,"moves":[0,0,0,0],"species":290},{"level":36,"moves":[0,0,0,0],"species":311},{"level":36,"moves":[0,0,0,0],"species":312}],"party_rom_address":3206608,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231020},{"battle_script_rom_address":0,"party":[{"level":38,"moves":[0,0,0,0],"species":311},{"level":38,"moves":[0,0,0,0],"species":294},{"level":38,"moves":[0,0,0,0],"species":311},{"level":38,"moves":[0,0,0,0],"species":312},{"level":38,"moves":[0,0,0,0],"species":292}],"party_rom_address":3206640,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3231060},{"battle_script_rom_address":2032546,"party":[{"level":15,"moves":[237,0,0,0],"species":63}],"party_rom_address":3206680,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3231100},{"battle_script_rom_address":2238272,"party":[{"level":36,"moves":[0,0,0,0],"species":393}],"party_rom_address":3206696,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231140},{"battle_script_rom_address":2238303,"party":[{"level":36,"moves":[0,0,0,0],"species":392}],"party_rom_address":3206704,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231180},{"battle_script_rom_address":2238334,"party":[{"level":36,"moves":[0,0,0,0],"species":203}],"party_rom_address":3206712,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231220},{"battle_script_rom_address":2307823,"party":[{"level":26,"moves":[0,0,0,0],"species":392},{"level":26,"moves":[0,0,0,0],"species":392},{"level":26,"moves":[0,0,0,0],"species":393}],"party_rom_address":3206720,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231260},{"battle_script_rom_address":2557525,"party":[{"level":41,"moves":[0,0,0,0],"species":64},{"level":41,"moves":[0,0,0,0],"species":349}],"party_rom_address":3206744,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231300},{"battle_script_rom_address":2062212,"party":[{"level":31,"moves":[0,0,0,0],"species":349}],"party_rom_address":3206760,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231340},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":64},{"level":33,"moves":[0,0,0,0],"species":349}],"party_rom_address":3206768,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231380},{"battle_script_rom_address":0,"party":[{"level":38,"moves":[0,0,0,0],"species":64},{"level":38,"moves":[0,0,0,0],"species":349}],"party_rom_address":3206784,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231420},{"battle_script_rom_address":0,"party":[{"level":41,"moves":[0,0,0,0],"species":64},{"level":41,"moves":[0,0,0,0],"species":349}],"party_rom_address":3206800,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231460},{"battle_script_rom_address":0,"party":[{"level":45,"moves":[0,0,0,0],"species":349},{"level":45,"moves":[0,0,0,0],"species":65}],"party_rom_address":3206816,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231500},{"battle_script_rom_address":2032577,"party":[{"level":16,"moves":[237,0,0,0],"species":63}],"party_rom_address":3206832,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3231540},{"battle_script_rom_address":2238365,"party":[{"level":36,"moves":[0,0,0,0],"species":393}],"party_rom_address":3206848,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231580},{"battle_script_rom_address":2238396,"party":[{"level":36,"moves":[0,0,0,0],"species":178}],"party_rom_address":3206856,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231620},{"battle_script_rom_address":2238427,"party":[{"level":36,"moves":[0,0,0,0],"species":64}],"party_rom_address":3206864,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231660},{"battle_script_rom_address":2307854,"party":[{"level":26,"moves":[0,0,0,0],"species":202},{"level":26,"moves":[0,0,0,0],"species":177},{"level":26,"moves":[0,0,0,0],"species":64}],"party_rom_address":3206872,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231700},{"battle_script_rom_address":2557587,"party":[{"level":41,"moves":[0,0,0,0],"species":393},{"level":41,"moves":[0,0,0,0],"species":178}],"party_rom_address":3206896,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231740},{"battle_script_rom_address":2062322,"party":[{"level":30,"moves":[0,0,0,0],"species":64},{"level":30,"moves":[0,0,0,0],"species":348}],"party_rom_address":3206912,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231780},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":64},{"level":34,"moves":[0,0,0,0],"species":348}],"party_rom_address":3206928,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231820},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":64},{"level":37,"moves":[0,0,0,0],"species":348}],"party_rom_address":3206944,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231860},{"battle_script_rom_address":0,"party":[{"level":40,"moves":[0,0,0,0],"species":64},{"level":40,"moves":[0,0,0,0],"species":348}],"party_rom_address":3206960,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231900},{"battle_script_rom_address":0,"party":[{"level":43,"moves":[0,0,0,0],"species":348},{"level":43,"moves":[0,0,0,0],"species":65}],"party_rom_address":3206976,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231940},{"battle_script_rom_address":2061209,"party":[{"level":29,"moves":[0,0,0,0],"species":338}],"party_rom_address":3206992,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3231980},{"battle_script_rom_address":2354274,"party":[{"level":44,"moves":[0,0,0,0],"species":338},{"level":44,"moves":[0,0,0,0],"species":338}],"party_rom_address":3207000,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3232020},{"battle_script_rom_address":2354305,"party":[{"level":45,"moves":[0,0,0,0],"species":380}],"party_rom_address":3207016,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3232060},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":338}],"party_rom_address":3207024,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3232100},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[29,28,60,154],"species":289},{"level":36,"moves":[98,209,60,46],"species":338}],"party_rom_address":3207032,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3232140},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[29,28,60,154],"species":289},{"level":39,"moves":[98,209,60,0],"species":338}],"party_rom_address":3207064,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3232180},{"battle_script_rom_address":0,"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_rom_address":3207096,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3232220},{"battle_script_rom_address":2268477,"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_rom_address":3207144,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232260},{"battle_script_rom_address":2269104,"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_rom_address":3207224,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232300},{"battle_script_rom_address":2269786,"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_rom_address":3207304,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232340},{"battle_script_rom_address":2270448,"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_rom_address":3207384,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232380},{"battle_script_rom_address":2181824,"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_rom_address":3207464,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232420},{"battle_script_rom_address":2089070,"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_rom_address":3207512,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232460},{"battle_script_rom_address":2161073,"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_rom_address":3207560,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232500},{"battle_script_rom_address":2097176,"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_rom_address":3207624,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232540},{"battle_script_rom_address":2123720,"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_rom_address":3207688,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232580},{"battle_script_rom_address":2195894,"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_rom_address":3207752,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232620},{"battle_script_rom_address":0,"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_rom_address":3207832,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232660},{"battle_script_rom_address":2255993,"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_rom_address":3207896,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3232700},{"battle_script_rom_address":2048342,"party":[{"level":9,"moves":[0,0,0,0],"species":392}],"party_rom_address":3207976,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3232740},{"battle_script_rom_address":2547425,"party":[{"level":17,"moves":[0,0,0,0],"species":392}],"party_rom_address":3207984,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3232780},{"battle_script_rom_address":2547456,"party":[{"level":15,"moves":[0,0,0,0],"species":339},{"level":15,"moves":[0,0,0,0],"species":43},{"level":15,"moves":[0,0,0,0],"species":309}],"party_rom_address":3207992,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3232820},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":392},{"level":26,"moves":[0,0,0,0],"species":356}],"party_rom_address":3208016,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3232860},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":393},{"level":29,"moves":[0,0,0,0],"species":356}],"party_rom_address":3208032,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3232900},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":393},{"level":32,"moves":[0,0,0,0],"species":357}],"party_rom_address":3208048,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3232940},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":393},{"level":34,"moves":[0,0,0,0],"species":378},{"level":34,"moves":[0,0,0,0],"species":357}],"party_rom_address":3208064,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3232980},{"battle_script_rom_address":2048590,"party":[{"level":9,"moves":[0,0,0,0],"species":306}],"party_rom_address":3208088,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3233020},{"battle_script_rom_address":2547487,"party":[{"level":16,"moves":[0,0,0,0],"species":306},{"level":16,"moves":[0,0,0,0],"species":292}],"party_rom_address":3208096,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3233060},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":306},{"level":26,"moves":[0,0,0,0],"species":370}],"party_rom_address":3208112,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3233100},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":306},{"level":29,"moves":[0,0,0,0],"species":371}],"party_rom_address":3208128,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3233140},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":307},{"level":32,"moves":[0,0,0,0],"species":371}],"party_rom_address":3208144,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3233180},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":307},{"level":35,"moves":[0,0,0,0],"species":372}],"party_rom_address":3208160,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3233220},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[95,60,146,42],"species":308},{"level":32,"moves":[8,25,47,185],"species":366}],"party_rom_address":3208176,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3233260},{"battle_script_rom_address":0,"party":[{"level":15,"moves":[45,39,29,60],"species":288},{"level":17,"moves":[33,116,36,0],"species":335}],"party_rom_address":3208208,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3233300},{"battle_script_rom_address":0,"party":[{"level":28,"moves":[45,39,29,60],"species":288},{"level":30,"moves":[33,116,36,0],"species":335}],"party_rom_address":3208240,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3233340},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[45,39,29,60],"species":288},{"level":33,"moves":[33,116,36,0],"species":335}],"party_rom_address":3208272,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3233380},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[45,39,29,60],"species":289},{"level":36,"moves":[33,116,36,0],"species":335}],"party_rom_address":3208304,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3233420},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[45,39,29,60],"species":289},{"level":38,"moves":[33,116,36,0],"species":336}],"party_rom_address":3208336,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3233460},{"battle_script_rom_address":2039914,"party":[{"level":16,"moves":[0,0,0,0],"species":304},{"level":16,"moves":[0,0,0,0],"species":288}],"party_rom_address":3208368,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233500},{"battle_script_rom_address":2020520,"party":[{"level":15,"moves":[0,0,0,0],"species":315}],"party_rom_address":3208384,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233540},{"battle_script_rom_address":2354243,"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_rom_address":3208392,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3233580},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":315}],"party_rom_address":3208488,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233620},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":315}],"party_rom_address":3208496,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233660},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":316}],"party_rom_address":3208504,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233700},{"battle_script_rom_address":0,"party":[{"level":38,"moves":[0,0,0,0],"species":316}],"party_rom_address":3208512,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233740},{"battle_script_rom_address":2040019,"party":[{"level":17,"moves":[0,0,0,0],"species":363}],"party_rom_address":3208520,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233780},{"battle_script_rom_address":2061178,"party":[{"level":30,"moves":[0,0,0,0],"species":25}],"party_rom_address":3208528,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233820},{"battle_script_rom_address":2259573,"party":[{"level":35,"moves":[0,0,0,0],"species":350},{"level":37,"moves":[0,0,0,0],"species":183},{"level":39,"moves":[0,0,0,0],"species":184}],"party_rom_address":3208536,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233860},{"battle_script_rom_address":2033062,"party":[{"level":14,"moves":[0,0,0,0],"species":353},{"level":14,"moves":[0,0,0,0],"species":354}],"party_rom_address":3208560,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233900},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":353},{"level":26,"moves":[0,0,0,0],"species":354}],"party_rom_address":3208576,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233940},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":353},{"level":29,"moves":[0,0,0,0],"species":354}],"party_rom_address":3208592,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3233980},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":353},{"level":32,"moves":[0,0,0,0],"species":354}],"party_rom_address":3208608,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3234020},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":353},{"level":35,"moves":[0,0,0,0],"species":354}],"party_rom_address":3208624,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3234060},{"battle_script_rom_address":2046913,"party":[{"level":27,"moves":[0,0,0,0],"species":336}],"party_rom_address":3208640,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234100},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[36,26,28,91],"species":336}],"party_rom_address":3208648,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3234140},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[36,26,28,91],"species":336}],"party_rom_address":3208664,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3234180},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[36,187,28,91],"species":336}],"party_rom_address":3208680,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3234220},{"battle_script_rom_address":0,"party":[{"level":42,"moves":[36,187,28,91],"species":336}],"party_rom_address":3208696,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3234260},{"battle_script_rom_address":2040229,"party":[{"level":18,"moves":[136,96,93,197],"species":356}],"party_rom_address":3208712,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3234300},{"battle_script_rom_address":2297913,"party":[{"level":21,"moves":[0,0,0,0],"species":356},{"level":21,"moves":[0,0,0,0],"species":335}],"party_rom_address":3208728,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234340},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":356},{"level":30,"moves":[0,0,0,0],"species":335}],"party_rom_address":3208744,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234380},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":357},{"level":33,"moves":[0,0,0,0],"species":336}],"party_rom_address":3208760,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234420},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[0,0,0,0],"species":357},{"level":36,"moves":[0,0,0,0],"species":336}],"party_rom_address":3208776,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234460},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":357},{"level":39,"moves":[0,0,0,0],"species":336}],"party_rom_address":3208792,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234500},{"battle_script_rom_address":2018881,"party":[{"level":5,"moves":[0,0,0,0],"species":286}],"party_rom_address":3208808,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234540},{"battle_script_rom_address":2023858,"party":[{"level":5,"moves":[0,0,0,0],"species":288},{"level":7,"moves":[0,0,0,0],"species":298}],"party_rom_address":3208816,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234580},{"battle_script_rom_address":2181995,"party":[{"level":10,"moves":[33,0,0,0],"species":74}],"party_rom_address":3208832,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3234620},{"battle_script_rom_address":2182026,"party":[{"level":8,"moves":[0,0,0,0],"species":74},{"level":8,"moves":[0,0,0,0],"species":74}],"party_rom_address":3208848,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234660},{"battle_script_rom_address":2048280,"party":[{"level":9,"moves":[0,0,0,0],"species":66}],"party_rom_address":3208864,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234700},{"battle_script_rom_address":2161555,"party":[{"level":17,"moves":[29,28,45,85],"species":288},{"level":17,"moves":[133,124,25,1],"species":367}],"party_rom_address":3208872,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3234740},{"battle_script_rom_address":2326366,"party":[{"level":43,"moves":[213,58,85,53],"species":366},{"level":43,"moves":[29,182,5,92],"species":362}],"party_rom_address":3208904,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3234780},{"battle_script_rom_address":2326397,"party":[{"level":43,"moves":[29,94,85,91],"species":394},{"level":43,"moves":[89,247,76,24],"species":366}],"party_rom_address":3208936,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3234820},{"battle_script_rom_address":2044723,"party":[{"level":19,"moves":[0,0,0,0],"species":332}],"party_rom_address":3208968,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234860},{"battle_script_rom_address":2044754,"party":[{"level":19,"moves":[0,0,0,0],"species":382}],"party_rom_address":3208976,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234900},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[0,0,0,0],"species":287}],"party_rom_address":3208984,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234940},{"battle_script_rom_address":0,"party":[{"level":28,"moves":[0,0,0,0],"species":305},{"level":30,"moves":[0,0,0,0],"species":287}],"party_rom_address":3208992,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3234980},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":305},{"level":29,"moves":[0,0,0,0],"species":289},{"level":33,"moves":[0,0,0,0],"species":287}],"party_rom_address":3209008,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235020},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":305},{"level":32,"moves":[0,0,0,0],"species":289},{"level":36,"moves":[0,0,0,0],"species":287}],"party_rom_address":3209032,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235060},{"battle_script_rom_address":2546619,"party":[{"level":14,"moves":[0,0,0,0],"species":288},{"level":16,"moves":[0,0,0,0],"species":288}],"party_rom_address":3209056,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235100},{"battle_script_rom_address":2019129,"party":[{"level":4,"moves":[0,0,0,0],"species":288},{"level":3,"moves":[0,0,0,0],"species":304}],"party_rom_address":3209072,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235140},{"battle_script_rom_address":2033172,"party":[{"level":15,"moves":[0,0,0,0],"species":382},{"level":13,"moves":[0,0,0,0],"species":337}],"party_rom_address":3209088,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235180},{"battle_script_rom_address":2271299,"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_rom_address":3209104,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3235220},{"battle_script_rom_address":2020489,"party":[{"level":5,"moves":[0,0,0,0],"species":129},{"level":10,"moves":[0,0,0,0],"species":72},{"level":15,"moves":[0,0,0,0],"species":129}],"party_rom_address":3209200,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235260},{"battle_script_rom_address":2023827,"party":[{"level":5,"moves":[0,0,0,0],"species":129},{"level":6,"moves":[0,0,0,0],"species":129},{"level":7,"moves":[0,0,0,0],"species":129}],"party_rom_address":3209224,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235300},{"battle_script_rom_address":2046307,"party":[{"level":16,"moves":[0,0,0,0],"species":129},{"level":17,"moves":[0,0,0,0],"species":118},{"level":18,"moves":[0,0,0,0],"species":323}],"party_rom_address":3209248,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235340},{"battle_script_rom_address":2028421,"party":[{"level":10,"moves":[0,0,0,0],"species":129},{"level":7,"moves":[0,0,0,0],"species":72},{"level":10,"moves":[0,0,0,0],"species":129}],"party_rom_address":3209272,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235380},{"battle_script_rom_address":2028531,"party":[{"level":11,"moves":[0,0,0,0],"species":72}],"party_rom_address":3209296,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235420},{"battle_script_rom_address":2032718,"party":[{"level":11,"moves":[0,0,0,0],"species":72},{"level":14,"moves":[0,0,0,0],"species":313},{"level":11,"moves":[0,0,0,0],"species":72},{"level":14,"moves":[0,0,0,0],"species":313}],"party_rom_address":3209304,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235460},{"battle_script_rom_address":2046338,"party":[{"level":19,"moves":[0,0,0,0],"species":323}],"party_rom_address":3209336,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235500},{"battle_script_rom_address":2052916,"party":[{"level":25,"moves":[0,0,0,0],"species":72},{"level":25,"moves":[0,0,0,0],"species":330}],"party_rom_address":3209344,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235540},{"battle_script_rom_address":2052947,"party":[{"level":16,"moves":[0,0,0,0],"species":72}],"party_rom_address":3209360,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235580},{"battle_script_rom_address":2030355,"party":[{"level":25,"moves":[0,0,0,0],"species":313},{"level":25,"moves":[0,0,0,0],"species":73}],"party_rom_address":3209368,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235620},{"battle_script_rom_address":0,"party":[{"level":24,"moves":[0,0,0,0],"species":72},{"level":27,"moves":[0,0,0,0],"species":130},{"level":27,"moves":[0,0,0,0],"species":130}],"party_rom_address":3209384,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235660},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":130},{"level":26,"moves":[0,0,0,0],"species":330},{"level":26,"moves":[0,0,0,0],"species":72},{"level":29,"moves":[0,0,0,0],"species":130}],"party_rom_address":3209408,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235700},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":130},{"level":30,"moves":[0,0,0,0],"species":330},{"level":30,"moves":[0,0,0,0],"species":73},{"level":31,"moves":[0,0,0,0],"species":130}],"party_rom_address":3209440,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235740},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":130},{"level":33,"moves":[0,0,0,0],"species":331},{"level":33,"moves":[0,0,0,0],"species":130},{"level":35,"moves":[0,0,0,0],"species":73}],"party_rom_address":3209472,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235780},{"battle_script_rom_address":2067670,"party":[{"level":19,"moves":[0,0,0,0],"species":129},{"level":21,"moves":[0,0,0,0],"species":130},{"level":23,"moves":[0,0,0,0],"species":130},{"level":26,"moves":[0,0,0,0],"species":130},{"level":30,"moves":[0,0,0,0],"species":130},{"level":35,"moves":[0,0,0,0],"species":130}],"party_rom_address":3209504,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235820},{"battle_script_rom_address":2032749,"party":[{"level":6,"moves":[0,0,0,0],"species":100},{"level":6,"moves":[0,0,0,0],"species":100},{"level":14,"moves":[0,0,0,0],"species":81}],"party_rom_address":3209552,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235860},{"battle_script_rom_address":2032780,"party":[{"level":14,"moves":[0,0,0,0],"species":81},{"level":14,"moves":[0,0,0,0],"species":81}],"party_rom_address":3209576,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235900},{"battle_script_rom_address":2032811,"party":[{"level":16,"moves":[0,0,0,0],"species":81}],"party_rom_address":3209592,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235940},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":81}],"party_rom_address":3209600,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3235980},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":81}],"party_rom_address":3209608,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236020},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[0,0,0,0],"species":82}],"party_rom_address":3209616,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236060},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":82}],"party_rom_address":3209624,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236100},{"battle_script_rom_address":2032952,"party":[{"level":16,"moves":[0,0,0,0],"species":81}],"party_rom_address":3209632,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236140},{"battle_script_rom_address":2032921,"party":[{"level":14,"moves":[0,0,0,0],"species":81},{"level":14,"moves":[0,0,0,0],"species":81},{"level":6,"moves":[0,0,0,0],"species":100}],"party_rom_address":3209640,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236180},{"battle_script_rom_address":0,"party":[{"level":28,"moves":[0,0,0,0],"species":81}],"party_rom_address":3209664,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236220},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":81}],"party_rom_address":3209672,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236260},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":82}],"party_rom_address":3209680,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236300},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":82}],"party_rom_address":3209688,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236340},{"battle_script_rom_address":2051475,"party":[{"level":17,"moves":[0,0,0,0],"species":84}],"party_rom_address":3209696,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236380},{"battle_script_rom_address":0,"party":[{"level":28,"moves":[0,0,0,0],"species":84}],"party_rom_address":3209704,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236420},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":84}],"party_rom_address":3209712,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236460},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":85}],"party_rom_address":3209720,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236500},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":85}],"party_rom_address":3209728,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236540},{"battle_script_rom_address":2051585,"party":[{"level":17,"moves":[0,0,0,0],"species":84}],"party_rom_address":3209736,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236580},{"battle_script_rom_address":0,"party":[{"level":28,"moves":[0,0,0,0],"species":84}],"party_rom_address":3209744,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236620},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":84}],"party_rom_address":3209752,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236660},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":85}],"party_rom_address":3209760,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236700},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":85}],"party_rom_address":3209768,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236740},{"battle_script_rom_address":2064615,"party":[{"level":33,"moves":[0,0,0,0],"species":120},{"level":33,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209776,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236780},{"battle_script_rom_address":2333618,"party":[{"level":25,"moves":[0,0,0,0],"species":288},{"level":25,"moves":[0,0,0,0],"species":337}],"party_rom_address":3209792,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236820},{"battle_script_rom_address":2065332,"party":[{"level":35,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209808,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236860},{"battle_script_rom_address":2064413,"party":[{"level":33,"moves":[0,0,0,0],"species":120},{"level":33,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209816,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236900},{"battle_script_rom_address":2066978,"party":[{"level":26,"moves":[0,0,0,0],"species":309},{"level":34,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209832,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236940},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209848,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3236980},{"battle_script_rom_address":0,"party":[{"level":42,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209856,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237020},{"battle_script_rom_address":0,"party":[{"level":45,"moves":[0,0,0,0],"species":121}],"party_rom_address":3209864,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237060},{"battle_script_rom_address":0,"party":[{"level":48,"moves":[0,0,0,0],"species":121}],"party_rom_address":3209872,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237100},{"battle_script_rom_address":2064351,"party":[{"level":34,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209880,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237140},{"battle_script_rom_address":2064646,"party":[{"level":26,"moves":[0,0,0,0],"species":309},{"level":34,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209888,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237180},{"battle_script_rom_address":2067545,"party":[{"level":34,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209904,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237220},{"battle_script_rom_address":2065442,"party":[{"level":35,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209912,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237260},{"battle_script_rom_address":2067009,"party":[{"level":27,"moves":[0,0,0,0],"species":309},{"level":33,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209920,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237300},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209936,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237340},{"battle_script_rom_address":0,"party":[{"level":42,"moves":[0,0,0,0],"species":120}],"party_rom_address":3209944,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237380},{"battle_script_rom_address":0,"party":[{"level":45,"moves":[0,0,0,0],"species":121}],"party_rom_address":3209952,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237420},{"battle_script_rom_address":0,"party":[{"level":48,"moves":[0,0,0,0],"species":121}],"party_rom_address":3209960,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237460},{"battle_script_rom_address":2286394,"party":[{"level":37,"moves":[0,0,0,0],"species":359},{"level":37,"moves":[0,0,0,0],"species":359}],"party_rom_address":3209968,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237500},{"battle_script_rom_address":0,"party":[{"level":41,"moves":[0,0,0,0],"species":359},{"level":41,"moves":[0,0,0,0],"species":359}],"party_rom_address":3209984,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237540},{"battle_script_rom_address":0,"party":[{"level":44,"moves":[0,0,0,0],"species":359},{"level":44,"moves":[0,0,0,0],"species":359}],"party_rom_address":3210000,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237580},{"battle_script_rom_address":0,"party":[{"level":46,"moves":[0,0,0,0],"species":395},{"level":46,"moves":[0,0,0,0],"species":359},{"level":46,"moves":[0,0,0,0],"species":359}],"party_rom_address":3210016,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237620},{"battle_script_rom_address":0,"party":[{"level":49,"moves":[0,0,0,0],"species":359},{"level":49,"moves":[0,0,0,0],"species":359},{"level":49,"moves":[0,0,0,0],"species":396}],"party_rom_address":3210040,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3237660},{"battle_script_rom_address":2068182,"party":[{"level":34,"moves":[225,29,116,52],"species":395}],"party_rom_address":3210064,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3237700},{"battle_script_rom_address":2053088,"party":[{"level":26,"moves":[0,0,0,0],"species":309}],"party_rom_address":3210080,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237740},{"battle_script_rom_address":2055395,"party":[{"level":25,"moves":[0,0,0,0],"species":309},{"level":25,"moves":[0,0,0,0],"species":369}],"party_rom_address":3210088,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237780},{"battle_script_rom_address":2055426,"party":[{"level":26,"moves":[0,0,0,0],"species":305}],"party_rom_address":3210104,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237820},{"battle_script_rom_address":2196092,"party":[{"level":27,"moves":[0,0,0,0],"species":84},{"level":27,"moves":[0,0,0,0],"species":227},{"level":27,"moves":[0,0,0,0],"species":369}],"party_rom_address":3210112,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237860},{"battle_script_rom_address":2196216,"party":[{"level":30,"moves":[0,0,0,0],"species":227}],"party_rom_address":3210136,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237900},{"battle_script_rom_address":2064118,"party":[{"level":33,"moves":[0,0,0,0],"species":369},{"level":33,"moves":[0,0,0,0],"species":178}],"party_rom_address":3210144,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237940},{"battle_script_rom_address":2196123,"party":[{"level":29,"moves":[0,0,0,0],"species":84},{"level":29,"moves":[0,0,0,0],"species":310}],"party_rom_address":3210160,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3237980},{"battle_script_rom_address":2059373,"party":[{"level":28,"moves":[0,0,0,0],"species":309},{"level":28,"moves":[0,0,0,0],"species":177}],"party_rom_address":3210176,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238020},{"battle_script_rom_address":2059404,"party":[{"level":29,"moves":[0,0,0,0],"species":358}],"party_rom_address":3210192,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238060},{"battle_script_rom_address":2556084,"party":[{"level":36,"moves":[0,0,0,0],"species":305},{"level":36,"moves":[0,0,0,0],"species":310},{"level":36,"moves":[0,0,0,0],"species":178}],"party_rom_address":3210200,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238100},{"battle_script_rom_address":2053119,"party":[{"level":25,"moves":[0,0,0,0],"species":304},{"level":25,"moves":[0,0,0,0],"species":305}],"party_rom_address":3210224,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238140},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":177},{"level":32,"moves":[0,0,0,0],"species":358}],"party_rom_address":3210240,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238180},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":177},{"level":35,"moves":[0,0,0,0],"species":359}],"party_rom_address":3210256,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238220},{"battle_script_rom_address":0,"party":[{"level":38,"moves":[0,0,0,0],"species":177},{"level":38,"moves":[0,0,0,0],"species":359}],"party_rom_address":3210272,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238260},{"battle_script_rom_address":0,"party":[{"level":41,"moves":[0,0,0,0],"species":359},{"level":41,"moves":[0,0,0,0],"species":178}],"party_rom_address":3210288,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238300},{"battle_script_rom_address":2068151,"party":[{"level":33,"moves":[0,0,0,0],"species":177},{"level":33,"moves":[0,0,0,0],"species":305}],"party_rom_address":3210304,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238340},{"battle_script_rom_address":2067981,"party":[{"level":34,"moves":[0,0,0,0],"species":369}],"party_rom_address":3210320,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238380},{"battle_script_rom_address":2055457,"party":[{"level":26,"moves":[0,0,0,0],"species":302}],"party_rom_address":3210328,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238420},{"battle_script_rom_address":2055488,"party":[{"level":25,"moves":[0,0,0,0],"species":302},{"level":25,"moves":[0,0,0,0],"species":109}],"party_rom_address":3210336,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238460},{"battle_script_rom_address":2329166,"party":[{"level":43,"moves":[29,89,0,0],"species":319},{"level":43,"moves":[85,89,0,0],"species":171}],"party_rom_address":3210352,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3238500},{"battle_script_rom_address":2335401,"party":[{"level":26,"moves":[0,0,0,0],"species":183}],"party_rom_address":3210384,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238540},{"battle_script_rom_address":2044895,"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_rom_address":3210392,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3238580},{"battle_script_rom_address":2045005,"party":[{"level":18,"moves":[0,0,0,0],"species":109},{"level":18,"moves":[0,0,0,0],"species":302}],"party_rom_address":3210440,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238620},{"battle_script_rom_address":0,"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_rom_address":3210456,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3238660},{"battle_script_rom_address":0,"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_rom_address":3210520,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3238700},{"battle_script_rom_address":0,"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_rom_address":3210584,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3238740},{"battle_script_rom_address":0,"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_rom_address":3210648,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3238780},{"battle_script_rom_address":2089310,"party":[{"level":13,"moves":[0,0,0,0],"species":356}],"party_rom_address":3210712,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238820},{"battle_script_rom_address":2089348,"party":[{"level":13,"moves":[0,0,0,0],"species":356}],"party_rom_address":3210720,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238860},{"battle_script_rom_address":2047164,"party":[{"level":18,"moves":[0,0,0,0],"species":356},{"level":18,"moves":[0,0,0,0],"species":335}],"party_rom_address":3210728,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238900},{"battle_script_rom_address":2550554,"party":[{"level":27,"moves":[0,0,0,0],"species":356}],"party_rom_address":3210744,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238940},{"battle_script_rom_address":2550616,"party":[{"level":27,"moves":[0,0,0,0],"species":307}],"party_rom_address":3210752,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3238980},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":356},{"level":26,"moves":[0,0,0,0],"species":335}],"party_rom_address":3210760,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239020},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":356},{"level":29,"moves":[0,0,0,0],"species":335}],"party_rom_address":3210776,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239060},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":357},{"level":32,"moves":[0,0,0,0],"species":336}],"party_rom_address":3210792,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239100},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":357},{"level":35,"moves":[0,0,0,0],"species":336}],"party_rom_address":3210808,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239140},{"battle_script_rom_address":2044785,"party":[{"level":19,"moves":[52,33,222,241],"species":339}],"party_rom_address":3210824,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3239180},{"battle_script_rom_address":2059748,"party":[{"level":28,"moves":[0,0,0,0],"species":363},{"level":28,"moves":[0,0,0,0],"species":313}],"party_rom_address":3210840,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239220},{"battle_script_rom_address":2059779,"party":[{"level":30,"moves":[240,55,87,96],"species":385}],"party_rom_address":3210856,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3239260},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[52,33,222,241],"species":339}],"party_rom_address":3210872,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3239300},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[52,36,222,241],"species":339}],"party_rom_address":3210888,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3239340},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[73,72,64,241],"species":363},{"level":34,"moves":[53,36,222,241],"species":339}],"party_rom_address":3210904,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3239380},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[73,202,76,241],"species":363},{"level":37,"moves":[53,36,89,241],"species":340}],"party_rom_address":3210936,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3239420},{"battle_script_rom_address":2027807,"party":[{"level":25,"moves":[0,0,0,0],"species":309},{"level":25,"moves":[0,0,0,0],"species":313}],"party_rom_address":3210968,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239460},{"battle_script_rom_address":2027838,"party":[{"level":26,"moves":[0,0,0,0],"species":183}],"party_rom_address":3210984,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239500},{"battle_script_rom_address":2028390,"party":[{"level":26,"moves":[0,0,0,0],"species":313}],"party_rom_address":3210992,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239540},{"battle_script_rom_address":2028794,"party":[{"level":25,"moves":[0,0,0,0],"species":309},{"level":25,"moves":[0,0,0,0],"species":118}],"party_rom_address":3211000,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239580},{"battle_script_rom_address":2028825,"party":[{"level":26,"moves":[0,0,0,0],"species":118}],"party_rom_address":3211016,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239620},{"battle_script_rom_address":2029012,"party":[{"level":25,"moves":[0,0,0,0],"species":116},{"level":25,"moves":[0,0,0,0],"species":183}],"party_rom_address":3211024,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239660},{"battle_script_rom_address":2029043,"party":[{"level":26,"moves":[0,0,0,0],"species":118}],"party_rom_address":3211040,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239700},{"battle_script_rom_address":2029980,"party":[{"level":24,"moves":[0,0,0,0],"species":118},{"level":24,"moves":[0,0,0,0],"species":309},{"level":24,"moves":[0,0,0,0],"species":118}],"party_rom_address":3211048,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239740},{"battle_script_rom_address":2063273,"party":[{"level":34,"moves":[0,0,0,0],"species":313}],"party_rom_address":3211072,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239780},{"battle_script_rom_address":2063383,"party":[{"level":34,"moves":[0,0,0,0],"species":183}],"party_rom_address":3211080,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239820},{"battle_script_rom_address":2063884,"party":[{"level":34,"moves":[0,0,0,0],"species":325}],"party_rom_address":3211088,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239860},{"battle_script_rom_address":2063915,"party":[{"level":34,"moves":[0,0,0,0],"species":119}],"party_rom_address":3211096,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239900},{"battle_script_rom_address":2064258,"party":[{"level":33,"moves":[0,0,0,0],"species":183},{"level":33,"moves":[0,0,0,0],"species":341}],"party_rom_address":3211104,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239940},{"battle_script_rom_address":2064289,"party":[{"level":34,"moves":[0,0,0,0],"species":118}],"party_rom_address":3211120,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3239980},{"battle_script_rom_address":2067260,"party":[{"level":33,"moves":[0,0,0,0],"species":118},{"level":33,"moves":[0,0,0,0],"species":341}],"party_rom_address":3211128,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240020},{"battle_script_rom_address":2067421,"party":[{"level":34,"moves":[0,0,0,0],"species":325}],"party_rom_address":3211144,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240060},{"battle_script_rom_address":2067452,"party":[{"level":34,"moves":[0,0,0,0],"species":119}],"party_rom_address":3211152,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240100},{"battle_script_rom_address":2067639,"party":[{"level":34,"moves":[0,0,0,0],"species":184}],"party_rom_address":3211160,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240140},{"battle_script_rom_address":2064382,"party":[{"level":33,"moves":[0,0,0,0],"species":325},{"level":33,"moves":[0,0,0,0],"species":325}],"party_rom_address":3211168,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240180},{"battle_script_rom_address":2067888,"party":[{"level":34,"moves":[0,0,0,0],"species":119}],"party_rom_address":3211184,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240220},{"battle_script_rom_address":2067919,"party":[{"level":33,"moves":[0,0,0,0],"species":116},{"level":33,"moves":[0,0,0,0],"species":117}],"party_rom_address":3211192,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240260},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":171},{"level":34,"moves":[0,0,0,0],"species":310}],"party_rom_address":3211208,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240300},{"battle_script_rom_address":2068120,"party":[{"level":33,"moves":[0,0,0,0],"species":325},{"level":33,"moves":[0,0,0,0],"species":325}],"party_rom_address":3211224,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240340},{"battle_script_rom_address":2065676,"party":[{"level":35,"moves":[0,0,0,0],"species":119}],"party_rom_address":3211240,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240380},{"battle_script_rom_address":0,"party":[{"level":38,"moves":[0,0,0,0],"species":313}],"party_rom_address":3211248,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240420},{"battle_script_rom_address":0,"party":[{"level":41,"moves":[0,0,0,0],"species":313}],"party_rom_address":3211256,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240460},{"battle_script_rom_address":0,"party":[{"level":43,"moves":[0,0,0,0],"species":120},{"level":43,"moves":[0,0,0,0],"species":313}],"party_rom_address":3211264,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240500},{"battle_script_rom_address":0,"party":[{"level":45,"moves":[0,0,0,0],"species":325},{"level":45,"moves":[0,0,0,0],"species":313},{"level":45,"moves":[0,0,0,0],"species":121}],"party_rom_address":3211280,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240540},{"battle_script_rom_address":2040526,"party":[{"level":22,"moves":[91,28,40,163],"species":27},{"level":22,"moves":[229,189,60,61],"species":318}],"party_rom_address":3211304,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3240580},{"battle_script_rom_address":2040588,"party":[{"level":22,"moves":[28,40,163,91],"species":27},{"level":22,"moves":[205,61,39,111],"species":183}],"party_rom_address":3211336,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3240620},{"battle_script_rom_address":2043989,"party":[{"level":17,"moves":[0,0,0,0],"species":304},{"level":17,"moves":[0,0,0,0],"species":296}],"party_rom_address":3211368,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240660},{"battle_script_rom_address":2046056,"party":[{"level":18,"moves":[0,0,0,0],"species":183},{"level":18,"moves":[0,0,0,0],"species":296}],"party_rom_address":3211384,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240700},{"battle_script_rom_address":2549863,"party":[{"level":23,"moves":[0,0,0,0],"species":315},{"level":23,"moves":[0,0,0,0],"species":358}],"party_rom_address":3211400,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240740},{"battle_script_rom_address":2303728,"party":[{"level":19,"moves":[0,0,0,0],"species":306},{"level":19,"moves":[0,0,0,0],"species":43},{"level":19,"moves":[0,0,0,0],"species":358}],"party_rom_address":3211416,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240780},{"battle_script_rom_address":2309489,"party":[{"level":32,"moves":[194,219,68,243],"species":202}],"party_rom_address":3211440,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3240820},{"battle_script_rom_address":2040760,"party":[{"level":17,"moves":[0,0,0,0],"species":306},{"level":17,"moves":[0,0,0,0],"species":183}],"party_rom_address":3211456,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240860},{"battle_script_rom_address":0,"party":[{"level":25,"moves":[0,0,0,0],"species":306},{"level":25,"moves":[0,0,0,0],"species":44},{"level":25,"moves":[0,0,0,0],"species":358}],"party_rom_address":3211472,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240900},{"battle_script_rom_address":0,"party":[{"level":28,"moves":[0,0,0,0],"species":307},{"level":28,"moves":[0,0,0,0],"species":44},{"level":28,"moves":[0,0,0,0],"species":358}],"party_rom_address":3211496,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240940},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":307},{"level":31,"moves":[0,0,0,0],"species":44},{"level":31,"moves":[0,0,0,0],"species":358}],"party_rom_address":3211520,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3240980},{"battle_script_rom_address":0,"party":[{"level":40,"moves":[0,0,0,0],"species":307},{"level":40,"moves":[0,0,0,0],"species":45},{"level":40,"moves":[0,0,0,0],"species":359}],"party_rom_address":3211544,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241020},{"battle_script_rom_address":0,"party":[{"level":15,"moves":[0,0,0,0],"species":353},{"level":15,"moves":[0,0,0,0],"species":354}],"party_rom_address":3211568,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241060},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[0,0,0,0],"species":353},{"level":27,"moves":[0,0,0,0],"species":354}],"party_rom_address":3211584,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241100},{"battle_script_rom_address":0,"party":[{"level":6,"moves":[0,0,0,0],"species":298},{"level":6,"moves":[0,0,0,0],"species":295}],"party_rom_address":3211600,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241140},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":292},{"level":26,"moves":[0,0,0,0],"species":294}],"party_rom_address":3211616,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241180},{"battle_script_rom_address":0,"party":[{"level":9,"moves":[0,0,0,0],"species":353},{"level":9,"moves":[0,0,0,0],"species":354}],"party_rom_address":3211632,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241220},{"battle_script_rom_address":0,"party":[{"level":10,"moves":[101,50,0,0],"species":361},{"level":10,"moves":[71,73,0,0],"species":306}],"party_rom_address":3211648,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3241260},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":353},{"level":30,"moves":[0,0,0,0],"species":354}],"party_rom_address":3211680,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241300},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[209,12,57,14],"species":353},{"level":33,"moves":[209,12,204,14],"species":354}],"party_rom_address":3211696,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3241340},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[87,12,57,14],"species":353},{"level":36,"moves":[87,12,204,14],"species":354}],"party_rom_address":3211728,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3241380},{"battle_script_rom_address":2030011,"party":[{"level":12,"moves":[0,0,0,0],"species":309},{"level":12,"moves":[0,0,0,0],"species":66}],"party_rom_address":3211760,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241420},{"battle_script_rom_address":2030042,"party":[{"level":13,"moves":[0,0,0,0],"species":309}],"party_rom_address":3211776,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241460},{"battle_script_rom_address":2063946,"party":[{"level":33,"moves":[0,0,0,0],"species":309},{"level":33,"moves":[0,0,0,0],"species":67}],"party_rom_address":3211784,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241500},{"battle_script_rom_address":2537258,"party":[{"level":11,"moves":[0,0,0,0],"species":309},{"level":11,"moves":[0,0,0,0],"species":66},{"level":11,"moves":[0,0,0,0],"species":72}],"party_rom_address":3211800,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241540},{"battle_script_rom_address":2353667,"party":[{"level":44,"moves":[0,0,0,0],"species":73},{"level":44,"moves":[0,0,0,0],"species":67}],"party_rom_address":3211824,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241580},{"battle_script_rom_address":2353698,"party":[{"level":43,"moves":[0,0,0,0],"species":66},{"level":43,"moves":[0,0,0,0],"species":310},{"level":43,"moves":[0,0,0,0],"species":67}],"party_rom_address":3211840,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241620},{"battle_script_rom_address":2334525,"party":[{"level":25,"moves":[0,0,0,0],"species":341},{"level":25,"moves":[0,0,0,0],"species":67}],"party_rom_address":3211864,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241660},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[0,0,0,0],"species":309},{"level":36,"moves":[0,0,0,0],"species":72},{"level":36,"moves":[0,0,0,0],"species":67}],"party_rom_address":3211880,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241700},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":310},{"level":39,"moves":[0,0,0,0],"species":72},{"level":39,"moves":[0,0,0,0],"species":67}],"party_rom_address":3211904,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241740},{"battle_script_rom_address":0,"party":[{"level":42,"moves":[0,0,0,0],"species":310},{"level":42,"moves":[0,0,0,0],"species":72},{"level":42,"moves":[0,0,0,0],"species":67}],"party_rom_address":3211928,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241780},{"battle_script_rom_address":0,"party":[{"level":45,"moves":[0,0,0,0],"species":310},{"level":45,"moves":[0,0,0,0],"species":67},{"level":45,"moves":[0,0,0,0],"species":73}],"party_rom_address":3211952,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241820},{"battle_script_rom_address":2097615,"party":[{"level":23,"moves":[0,0,0,0],"species":339}],"party_rom_address":3211976,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241860},{"battle_script_rom_address":2259604,"party":[{"level":39,"moves":[175,96,216,213],"species":328},{"level":39,"moves":[175,96,216,213],"species":328}],"party_rom_address":3211984,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3241900},{"battle_script_rom_address":2062680,"party":[{"level":27,"moves":[0,0,0,0],"species":376}],"party_rom_address":3212016,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3241940},{"battle_script_rom_address":2062649,"party":[{"level":31,"moves":[92,87,120,188],"species":109}],"party_rom_address":3212024,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3241980},{"battle_script_rom_address":2062618,"party":[{"level":31,"moves":[241,55,53,76],"species":385}],"party_rom_address":3212040,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3242020},{"battle_script_rom_address":2064149,"party":[{"level":33,"moves":[0,0,0,0],"species":338},{"level":33,"moves":[0,0,0,0],"species":68}],"party_rom_address":3212056,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242060},{"battle_script_rom_address":2068337,"party":[{"level":33,"moves":[0,0,0,0],"species":67},{"level":33,"moves":[0,0,0,0],"species":341}],"party_rom_address":3212072,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242100},{"battle_script_rom_address":2068306,"party":[{"level":34,"moves":[44,46,86,85],"species":338}],"party_rom_address":3212088,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3242140},{"battle_script_rom_address":2068275,"party":[{"level":33,"moves":[0,0,0,0],"species":356},{"level":33,"moves":[0,0,0,0],"species":336}],"party_rom_address":3212104,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242180},{"battle_script_rom_address":2068244,"party":[{"level":34,"moves":[0,0,0,0],"species":313}],"party_rom_address":3212120,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242220},{"battle_script_rom_address":2068043,"party":[{"level":33,"moves":[0,0,0,0],"species":170},{"level":33,"moves":[0,0,0,0],"species":336}],"party_rom_address":3212128,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242260},{"battle_script_rom_address":2032608,"party":[{"level":14,"moves":[0,0,0,0],"species":296},{"level":14,"moves":[0,0,0,0],"species":299}],"party_rom_address":3212144,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242300},{"battle_script_rom_address":2047274,"party":[{"level":18,"moves":[0,0,0,0],"species":380},{"level":18,"moves":[0,0,0,0],"species":379}],"party_rom_address":3212160,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242340},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[0,0,0,0],"species":340},{"level":38,"moves":[0,0,0,0],"species":287},{"level":40,"moves":[0,0,0,0],"species":42}],"party_rom_address":3212176,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242380},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":296},{"level":26,"moves":[0,0,0,0],"species":299}],"party_rom_address":3212200,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242420},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":296},{"level":29,"moves":[0,0,0,0],"species":299}],"party_rom_address":3212216,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242460},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":296},{"level":32,"moves":[0,0,0,0],"species":299}],"party_rom_address":3212232,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242500},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":297},{"level":35,"moves":[0,0,0,0],"species":300}],"party_rom_address":3212248,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242540},{"battle_script_rom_address":2326117,"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_rom_address":3212264,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3242580},{"battle_script_rom_address":2019962,"party":[{"level":5,"moves":[0,0,0,0],"species":277}],"party_rom_address":3212344,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242620},{"battle_script_rom_address":2033952,"party":[{"level":18,"moves":[0,0,0,0],"species":218},{"level":18,"moves":[0,0,0,0],"species":309},{"level":20,"moves":[0,0,0,0],"species":278}],"party_rom_address":3212352,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242660},{"battle_script_rom_address":2054543,"party":[{"level":29,"moves":[0,0,0,0],"species":218},{"level":29,"moves":[0,0,0,0],"species":310},{"level":31,"moves":[0,0,0,0],"species":278}],"party_rom_address":3212376,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242700},{"battle_script_rom_address":2019906,"party":[{"level":5,"moves":[0,0,0,0],"species":280}],"party_rom_address":3212400,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242740},{"battle_script_rom_address":2033896,"party":[{"level":18,"moves":[0,0,0,0],"species":309},{"level":18,"moves":[0,0,0,0],"species":296},{"level":20,"moves":[0,0,0,0],"species":281}],"party_rom_address":3212408,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242780},{"battle_script_rom_address":2054487,"party":[{"level":29,"moves":[0,0,0,0],"species":310},{"level":29,"moves":[0,0,0,0],"species":296},{"level":31,"moves":[0,0,0,0],"species":281}],"party_rom_address":3212432,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242820},{"battle_script_rom_address":2019934,"party":[{"level":5,"moves":[0,0,0,0],"species":283}],"party_rom_address":3212456,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242860},{"battle_script_rom_address":2033924,"party":[{"level":18,"moves":[0,0,0,0],"species":296},{"level":18,"moves":[0,0,0,0],"species":218},{"level":20,"moves":[0,0,0,0],"species":284}],"party_rom_address":3212464,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242900},{"battle_script_rom_address":2054515,"party":[{"level":29,"moves":[0,0,0,0],"species":296},{"level":29,"moves":[0,0,0,0],"species":218},{"level":31,"moves":[0,0,0,0],"species":284}],"party_rom_address":3212488,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242940},{"battle_script_rom_address":2019878,"party":[{"level":5,"moves":[0,0,0,0],"species":277}],"party_rom_address":3212512,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3242980},{"battle_script_rom_address":2033794,"party":[{"level":18,"moves":[0,0,0,0],"species":309},{"level":18,"moves":[0,0,0,0],"species":218},{"level":20,"moves":[0,0,0,0],"species":278}],"party_rom_address":3212520,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243020},{"battle_script_rom_address":2054385,"party":[{"level":29,"moves":[0,0,0,0],"species":218},{"level":29,"moves":[0,0,0,0],"species":296},{"level":31,"moves":[0,0,0,0],"species":278}],"party_rom_address":3212544,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243060},{"battle_script_rom_address":2019822,"party":[{"level":5,"moves":[0,0,0,0],"species":280}],"party_rom_address":3212568,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243100},{"battle_script_rom_address":2033738,"party":[{"level":18,"moves":[0,0,0,0],"species":309},{"level":18,"moves":[0,0,0,0],"species":296},{"level":20,"moves":[0,0,0,0],"species":281}],"party_rom_address":3212576,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243140},{"battle_script_rom_address":2054329,"party":[{"level":29,"moves":[0,0,0,0],"species":310},{"level":29,"moves":[0,0,0,0],"species":296},{"level":31,"moves":[0,0,0,0],"species":281}],"party_rom_address":3212600,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243180},{"battle_script_rom_address":2019850,"party":[{"level":5,"moves":[0,0,0,0],"species":283}],"party_rom_address":3212624,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243220},{"battle_script_rom_address":2033766,"party":[{"level":18,"moves":[0,0,0,0],"species":296},{"level":18,"moves":[0,0,0,0],"species":218},{"level":20,"moves":[0,0,0,0],"species":284}],"party_rom_address":3212632,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243260},{"battle_script_rom_address":2054357,"party":[{"level":29,"moves":[0,0,0,0],"species":296},{"level":29,"moves":[0,0,0,0],"species":218},{"level":31,"moves":[0,0,0,0],"species":284}],"party_rom_address":3212656,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243300},{"battle_script_rom_address":2051255,"party":[{"level":11,"moves":[0,0,0,0],"species":370},{"level":11,"moves":[0,0,0,0],"species":288},{"level":11,"moves":[0,0,0,0],"species":382},{"level":11,"moves":[0,0,0,0],"species":286},{"level":11,"moves":[0,0,0,0],"species":304},{"level":11,"moves":[0,0,0,0],"species":335}],"party_rom_address":3212680,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243340},{"battle_script_rom_address":2062711,"party":[{"level":27,"moves":[0,0,0,0],"species":127}],"party_rom_address":3212728,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243380},{"battle_script_rom_address":2328056,"party":[{"level":43,"moves":[153,115,113,94],"species":348},{"level":43,"moves":[153,115,113,247],"species":349}],"party_rom_address":3212736,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3243420},{"battle_script_rom_address":0,"party":[{"level":22,"moves":[0,0,0,0],"species":371},{"level":22,"moves":[0,0,0,0],"species":289},{"level":22,"moves":[0,0,0,0],"species":382},{"level":22,"moves":[0,0,0,0],"species":287},{"level":22,"moves":[0,0,0,0],"species":305},{"level":22,"moves":[0,0,0,0],"species":335}],"party_rom_address":3212768,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243460},{"battle_script_rom_address":0,"party":[{"level":25,"moves":[0,0,0,0],"species":371},{"level":25,"moves":[0,0,0,0],"species":289},{"level":25,"moves":[0,0,0,0],"species":382},{"level":25,"moves":[0,0,0,0],"species":287},{"level":25,"moves":[0,0,0,0],"species":305},{"level":25,"moves":[0,0,0,0],"species":336}],"party_rom_address":3212816,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243500},{"battle_script_rom_address":0,"party":[{"level":28,"moves":[0,0,0,0],"species":371},{"level":28,"moves":[0,0,0,0],"species":289},{"level":28,"moves":[0,0,0,0],"species":382},{"level":28,"moves":[0,0,0,0],"species":287},{"level":28,"moves":[0,0,0,0],"species":305},{"level":28,"moves":[0,0,0,0],"species":336}],"party_rom_address":3212864,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243540},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":371},{"level":31,"moves":[0,0,0,0],"species":289},{"level":31,"moves":[0,0,0,0],"species":383},{"level":31,"moves":[0,0,0,0],"species":287},{"level":31,"moves":[0,0,0,0],"species":305},{"level":31,"moves":[0,0,0,0],"species":336}],"party_rom_address":3212912,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243580},{"battle_script_rom_address":2051365,"party":[{"level":11,"moves":[0,0,0,0],"species":309},{"level":11,"moves":[0,0,0,0],"species":306},{"level":11,"moves":[0,0,0,0],"species":183},{"level":11,"moves":[0,0,0,0],"species":363},{"level":11,"moves":[0,0,0,0],"species":315},{"level":11,"moves":[0,0,0,0],"species":118}],"party_rom_address":3212960,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243620},{"battle_script_rom_address":2328087,"party":[{"level":43,"moves":[0,0,0,0],"species":322},{"level":43,"moves":[0,0,0,0],"species":376}],"party_rom_address":3213008,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243660},{"battle_script_rom_address":2335432,"party":[{"level":26,"moves":[0,0,0,0],"species":28}],"party_rom_address":3213024,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243700},{"battle_script_rom_address":0,"party":[{"level":22,"moves":[0,0,0,0],"species":309},{"level":22,"moves":[0,0,0,0],"species":306},{"level":22,"moves":[0,0,0,0],"species":183},{"level":22,"moves":[0,0,0,0],"species":363},{"level":22,"moves":[0,0,0,0],"species":315},{"level":22,"moves":[0,0,0,0],"species":118}],"party_rom_address":3213032,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243740},{"battle_script_rom_address":0,"party":[{"level":25,"moves":[0,0,0,0],"species":310},{"level":25,"moves":[0,0,0,0],"species":307},{"level":25,"moves":[0,0,0,0],"species":183},{"level":25,"moves":[0,0,0,0],"species":363},{"level":25,"moves":[0,0,0,0],"species":316},{"level":25,"moves":[0,0,0,0],"species":118}],"party_rom_address":3213080,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243780},{"battle_script_rom_address":0,"party":[{"level":28,"moves":[0,0,0,0],"species":310},{"level":28,"moves":[0,0,0,0],"species":307},{"level":28,"moves":[0,0,0,0],"species":183},{"level":28,"moves":[0,0,0,0],"species":363},{"level":28,"moves":[0,0,0,0],"species":316},{"level":28,"moves":[0,0,0,0],"species":118}],"party_rom_address":3213128,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243820},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":310},{"level":31,"moves":[0,0,0,0],"species":307},{"level":31,"moves":[0,0,0,0],"species":184},{"level":31,"moves":[0,0,0,0],"species":363},{"level":31,"moves":[0,0,0,0],"species":316},{"level":31,"moves":[0,0,0,0],"species":119}],"party_rom_address":3213176,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243860},{"battle_script_rom_address":2055175,"party":[{"level":27,"moves":[0,0,0,0],"species":307}],"party_rom_address":3213224,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243900},{"battle_script_rom_address":2059514,"party":[{"level":28,"moves":[0,0,0,0],"species":298},{"level":28,"moves":[0,0,0,0],"species":299},{"level":28,"moves":[0,0,0,0],"species":296}],"party_rom_address":3213232,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243940},{"battle_script_rom_address":2556115,"party":[{"level":39,"moves":[0,0,0,0],"species":345}],"party_rom_address":3213256,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3243980},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":307}],"party_rom_address":3213264,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244020},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":307}],"party_rom_address":3213272,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244060},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":307}],"party_rom_address":3213280,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244100},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":317},{"level":39,"moves":[0,0,0,0],"species":307}],"party_rom_address":3213288,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244140},{"battle_script_rom_address":2055285,"party":[{"level":26,"moves":[0,0,0,0],"species":44},{"level":26,"moves":[0,0,0,0],"species":363}],"party_rom_address":3213304,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244180},{"battle_script_rom_address":2059545,"party":[{"level":28,"moves":[0,0,0,0],"species":295},{"level":28,"moves":[0,0,0,0],"species":296},{"level":28,"moves":[0,0,0,0],"species":299}],"party_rom_address":3213320,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244220},{"battle_script_rom_address":2556053,"party":[{"level":38,"moves":[0,0,0,0],"species":358},{"level":38,"moves":[0,0,0,0],"species":363}],"party_rom_address":3213344,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244260},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":44},{"level":30,"moves":[0,0,0,0],"species":363}],"party_rom_address":3213360,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244300},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":44},{"level":33,"moves":[0,0,0,0],"species":363}],"party_rom_address":3213376,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244340},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[0,0,0,0],"species":44},{"level":36,"moves":[0,0,0,0],"species":363}],"party_rom_address":3213392,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244380},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":182},{"level":39,"moves":[0,0,0,0],"species":363}],"party_rom_address":3213408,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244420},{"battle_script_rom_address":2303942,"party":[{"level":21,"moves":[0,0,0,0],"species":81}],"party_rom_address":3213424,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244460},{"battle_script_rom_address":2320797,"party":[{"level":35,"moves":[0,0,0,0],"species":287},{"level":35,"moves":[0,0,0,0],"species":42}],"party_rom_address":3213432,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244500},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":313},{"level":31,"moves":[0,0,0,0],"species":41}],"party_rom_address":3213448,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244540},{"battle_script_rom_address":2311225,"party":[{"level":30,"moves":[0,0,0,0],"species":313},{"level":30,"moves":[0,0,0,0],"species":41}],"party_rom_address":3213464,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244580},{"battle_script_rom_address":2303629,"party":[{"level":22,"moves":[0,0,0,0],"species":286},{"level":22,"moves":[0,0,0,0],"species":339}],"party_rom_address":3213480,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244620},{"battle_script_rom_address":2182057,"party":[{"level":8,"moves":[0,0,0,0],"species":74},{"level":8,"moves":[0,0,0,0],"species":74}],"party_rom_address":3213496,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244660},{"battle_script_rom_address":2089386,"party":[{"level":13,"moves":[0,0,0,0],"species":66}],"party_rom_address":3213512,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244700},{"battle_script_rom_address":2089462,"party":[{"level":13,"moves":[0,0,0,0],"species":356}],"party_rom_address":3213520,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244740},{"battle_script_rom_address":2089424,"party":[{"level":13,"moves":[0,0,0,0],"species":335}],"party_rom_address":3213528,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244780},{"battle_script_rom_address":2238458,"party":[{"level":36,"moves":[0,0,0,0],"species":356}],"party_rom_address":3213536,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244820},{"battle_script_rom_address":2064320,"party":[{"level":34,"moves":[0,0,0,0],"species":330}],"party_rom_address":3213544,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244860},{"battle_script_rom_address":2064801,"party":[{"level":32,"moves":[87,86,98,0],"species":338},{"level":32,"moves":[57,168,0,0],"species":289}],"party_rom_address":3213552,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3244900},{"battle_script_rom_address":2065645,"party":[{"level":35,"moves":[0,0,0,0],"species":73}],"party_rom_address":3213584,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244940},{"battle_script_rom_address":2297708,"party":[{"level":20,"moves":[0,0,0,0],"species":41}],"party_rom_address":3213592,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3244980},{"battle_script_rom_address":2067102,"party":[{"level":34,"moves":[0,0,0,0],"species":331}],"party_rom_address":3213600,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245020},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":203}],"party_rom_address":3213608,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245060},{"battle_script_rom_address":2238489,"party":[{"level":36,"moves":[0,0,0,0],"species":351}],"party_rom_address":3213616,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245100},{"battle_script_rom_address":2238613,"party":[{"level":36,"moves":[0,0,0,0],"species":64}],"party_rom_address":3213624,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245140},{"battle_script_rom_address":2238551,"party":[{"level":36,"moves":[0,0,0,0],"species":203}],"party_rom_address":3213632,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245180},{"battle_script_rom_address":2238582,"party":[{"level":36,"moves":[0,0,0,0],"species":202}],"party_rom_address":3213640,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245220},{"battle_script_rom_address":2248375,"party":[{"level":31,"moves":[0,0,0,0],"species":41},{"level":31,"moves":[0,0,0,0],"species":286}],"party_rom_address":3213648,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245260},{"battle_script_rom_address":2248437,"party":[{"level":32,"moves":[0,0,0,0],"species":318}],"party_rom_address":3213664,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245300},{"battle_script_rom_address":2251538,"party":[{"level":32,"moves":[0,0,0,0],"species":41}],"party_rom_address":3213672,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245340},{"battle_script_rom_address":2251588,"party":[{"level":32,"moves":[0,0,0,0],"species":287}],"party_rom_address":3213680,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245380},{"battle_script_rom_address":2251638,"party":[{"level":32,"moves":[0,0,0,0],"species":318}],"party_rom_address":3213688,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245420},{"battle_script_rom_address":2238520,"party":[{"level":36,"moves":[0,0,0,0],"species":177}],"party_rom_address":3213696,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245460},{"battle_script_rom_address":1973930,"party":[{"level":13,"moves":[0,0,0,0],"species":295},{"level":15,"moves":[0,0,0,0],"species":280}],"party_rom_address":3213704,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245500},{"battle_script_rom_address":1973992,"party":[{"level":13,"moves":[0,0,0,0],"species":309},{"level":15,"moves":[0,0,0,0],"species":277}],"party_rom_address":3213720,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245540},{"battle_script_rom_address":2067732,"party":[{"level":33,"moves":[0,0,0,0],"species":305},{"level":33,"moves":[0,0,0,0],"species":307}],"party_rom_address":3213736,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245580},{"battle_script_rom_address":2063684,"party":[{"level":34,"moves":[0,0,0,0],"species":120}],"party_rom_address":3213752,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245620},{"battle_script_rom_address":2564748,"party":[{"level":27,"moves":[0,0,0,0],"species":41},{"level":27,"moves":[0,0,0,0],"species":286}],"party_rom_address":3213760,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245660},{"battle_script_rom_address":2297677,"party":[{"level":18,"moves":[0,0,0,0],"species":339},{"level":20,"moves":[0,0,0,0],"species":286},{"level":22,"moves":[0,0,0,0],"species":339},{"level":22,"moves":[0,0,0,0],"species":41}],"party_rom_address":3213776,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245700},{"battle_script_rom_address":2067794,"party":[{"level":33,"moves":[0,0,0,0],"species":317},{"level":33,"moves":[0,0,0,0],"species":371}],"party_rom_address":3213808,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245740},{"battle_script_rom_address":1973961,"party":[{"level":13,"moves":[0,0,0,0],"species":218},{"level":15,"moves":[0,0,0,0],"species":283}],"party_rom_address":3213824,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245780},{"battle_script_rom_address":1973706,"party":[{"level":13,"moves":[0,0,0,0],"species":309},{"level":15,"moves":[0,0,0,0],"species":277}],"party_rom_address":3213840,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245820},{"battle_script_rom_address":2344934,"party":[{"level":37,"moves":[0,0,0,0],"species":287},{"level":38,"moves":[0,0,0,0],"species":169},{"level":39,"moves":[0,0,0,0],"species":340}],"party_rom_address":3213856,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245860},{"battle_script_rom_address":2297108,"party":[{"level":24,"moves":[0,0,0,0],"species":287},{"level":24,"moves":[0,0,0,0],"species":41},{"level":25,"moves":[0,0,0,0],"species":340}],"party_rom_address":3213880,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245900},{"battle_script_rom_address":2019098,"party":[{"level":4,"moves":[0,0,0,0],"species":288},{"level":4,"moves":[0,0,0,0],"species":306}],"party_rom_address":3213904,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245940},{"battle_script_rom_address":2023889,"party":[{"level":6,"moves":[0,0,0,0],"species":295},{"level":6,"moves":[0,0,0,0],"species":306}],"party_rom_address":3213920,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3245980},{"battle_script_rom_address":2048559,"party":[{"level":9,"moves":[0,0,0,0],"species":183}],"party_rom_address":3213936,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246020},{"battle_script_rom_address":2040124,"party":[{"level":15,"moves":[0,0,0,0],"species":183},{"level":15,"moves":[0,0,0,0],"species":306},{"level":15,"moves":[0,0,0,0],"species":339}],"party_rom_address":3213944,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246060},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":296},{"level":26,"moves":[0,0,0,0],"species":306}],"party_rom_address":3213968,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246100},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":296},{"level":29,"moves":[0,0,0,0],"species":307}],"party_rom_address":3213984,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246140},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":296},{"level":32,"moves":[0,0,0,0],"species":307}],"party_rom_address":3214000,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246180},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":305},{"level":34,"moves":[0,0,0,0],"species":296},{"level":34,"moves":[0,0,0,0],"species":307}],"party_rom_address":3214016,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246220},{"battle_script_rom_address":2546588,"party":[{"level":16,"moves":[0,0,0,0],"species":43}],"party_rom_address":3214040,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246260},{"battle_script_rom_address":2546650,"party":[{"level":14,"moves":[0,0,0,0],"species":315},{"level":14,"moves":[0,0,0,0],"species":306},{"level":14,"moves":[0,0,0,0],"species":183}],"party_rom_address":3214048,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246300},{"battle_script_rom_address":2259356,"party":[{"level":40,"moves":[0,0,0,0],"species":325}],"party_rom_address":3214072,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246340},{"battle_script_rom_address":2259387,"party":[{"level":39,"moves":[0,0,0,0],"species":118},{"level":39,"moves":[0,0,0,0],"species":313}],"party_rom_address":3214080,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246380},{"battle_script_rom_address":2019067,"party":[{"level":4,"moves":[0,0,0,0],"species":290},{"level":4,"moves":[0,0,0,0],"species":290}],"party_rom_address":3214096,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246420},{"battle_script_rom_address":2294060,"party":[{"level":3,"moves":[0,0,0,0],"species":290},{"level":3,"moves":[0,0,0,0],"species":290},{"level":3,"moves":[0,0,0,0],"species":290},{"level":3,"moves":[0,0,0,0],"species":290}],"party_rom_address":3214112,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246460},{"battle_script_rom_address":2048311,"party":[{"level":8,"moves":[0,0,0,0],"species":290},{"level":8,"moves":[0,0,0,0],"species":301}],"party_rom_address":3214144,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246500},{"battle_script_rom_address":2055082,"party":[{"level":28,"moves":[0,0,0,0],"species":301},{"level":28,"moves":[0,0,0,0],"species":302}],"party_rom_address":3214160,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246540},{"battle_script_rom_address":2055113,"party":[{"level":25,"moves":[0,0,0,0],"species":386},{"level":25,"moves":[0,0,0,0],"species":387}],"party_rom_address":3214176,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246580},{"battle_script_rom_address":2055144,"party":[{"level":25,"moves":[0,0,0,0],"species":302}],"party_rom_address":3214192,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246620},{"battle_script_rom_address":2294091,"party":[{"level":6,"moves":[0,0,0,0],"species":301},{"level":6,"moves":[0,0,0,0],"species":301}],"party_rom_address":3214200,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246660},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[0,0,0,0],"species":302}],"party_rom_address":3214216,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246700},{"battle_script_rom_address":0,"party":[{"level":29,"moves":[0,0,0,0],"species":294},{"level":29,"moves":[0,0,0,0],"species":302}],"party_rom_address":3214224,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246740},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":311},{"level":31,"moves":[0,0,0,0],"species":294},{"level":31,"moves":[0,0,0,0],"species":302}],"party_rom_address":3214240,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246780},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":311},{"level":33,"moves":[0,0,0,0],"species":302},{"level":33,"moves":[0,0,0,0],"species":294},{"level":33,"moves":[0,0,0,0],"species":302}],"party_rom_address":3214264,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246820},{"battle_script_rom_address":2043817,"party":[{"level":17,"moves":[0,0,0,0],"species":339},{"level":17,"moves":[0,0,0,0],"species":66}],"party_rom_address":3214296,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246860},{"battle_script_rom_address":2043848,"party":[{"level":16,"moves":[0,0,0,0],"species":74},{"level":17,"moves":[0,0,0,0],"species":74},{"level":16,"moves":[0,0,0,0],"species":74}],"party_rom_address":3214312,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246900},{"battle_script_rom_address":2045963,"party":[{"level":18,"moves":[0,0,0,0],"species":74},{"level":18,"moves":[0,0,0,0],"species":66}],"party_rom_address":3214336,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246940},{"battle_script_rom_address":2045994,"party":[{"level":18,"moves":[0,0,0,0],"species":74},{"level":18,"moves":[0,0,0,0],"species":339}],"party_rom_address":3214352,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3246980},{"battle_script_rom_address":2549894,"party":[{"level":22,"moves":[0,0,0,0],"species":74},{"level":22,"moves":[0,0,0,0],"species":320},{"level":22,"moves":[0,0,0,0],"species":75}],"party_rom_address":3214368,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247020},{"battle_script_rom_address":2048528,"party":[{"level":8,"moves":[0,0,0,0],"species":74}],"party_rom_address":3214392,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247060},{"battle_script_rom_address":2303697,"party":[{"level":20,"moves":[0,0,0,0],"species":74},{"level":20,"moves":[0,0,0,0],"species":318}],"party_rom_address":3214400,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247100},{"battle_script_rom_address":0,"party":[{"level":9,"moves":[150,55,0,0],"species":313}],"party_rom_address":3214416,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3247140},{"battle_script_rom_address":0,"party":[{"level":10,"moves":[16,45,0,0],"species":310},{"level":10,"moves":[44,184,0,0],"species":286}],"party_rom_address":3214432,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3247180},{"battle_script_rom_address":2289712,"party":[{"level":16,"moves":[0,0,0,0],"species":74},{"level":16,"moves":[0,0,0,0],"species":74},{"level":16,"moves":[0,0,0,0],"species":66}],"party_rom_address":3214464,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247220},{"battle_script_rom_address":0,"party":[{"level":24,"moves":[0,0,0,0],"species":74},{"level":24,"moves":[0,0,0,0],"species":74},{"level":24,"moves":[0,0,0,0],"species":74},{"level":24,"moves":[0,0,0,0],"species":75}],"party_rom_address":3214488,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247260},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[0,0,0,0],"species":74},{"level":27,"moves":[0,0,0,0],"species":74},{"level":27,"moves":[0,0,0,0],"species":75},{"level":27,"moves":[0,0,0,0],"species":75}],"party_rom_address":3214520,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247300},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":74},{"level":30,"moves":[0,0,0,0],"species":75},{"level":30,"moves":[0,0,0,0],"species":75},{"level":30,"moves":[0,0,0,0],"species":75}],"party_rom_address":3214552,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247340},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":75},{"level":33,"moves":[0,0,0,0],"species":75},{"level":33,"moves":[0,0,0,0],"species":75},{"level":33,"moves":[0,0,0,0],"species":76}],"party_rom_address":3214584,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247380},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":316},{"level":31,"moves":[0,0,0,0],"species":338}],"party_rom_address":3214616,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247420},{"battle_script_rom_address":0,"party":[{"level":45,"moves":[0,0,0,0],"species":325},{"level":45,"moves":[0,0,0,0],"species":325}],"party_rom_address":3214632,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247460},{"battle_script_rom_address":0,"party":[{"level":25,"moves":[0,0,0,0],"species":386},{"level":25,"moves":[0,0,0,0],"species":387}],"party_rom_address":3214648,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247500},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":386},{"level":30,"moves":[0,0,0,0],"species":387}],"party_rom_address":3214664,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247540},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":386},{"level":33,"moves":[0,0,0,0],"species":387}],"party_rom_address":3214680,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247580},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[0,0,0,0],"species":386},{"level":36,"moves":[0,0,0,0],"species":387}],"party_rom_address":3214696,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247620},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":386},{"level":39,"moves":[0,0,0,0],"species":387}],"party_rom_address":3214712,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247660},{"battle_script_rom_address":2537289,"party":[{"level":13,"moves":[0,0,0,0],"species":118}],"party_rom_address":3214728,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247700},{"battle_script_rom_address":2097522,"party":[{"level":23,"moves":[53,154,185,20],"species":317}],"party_rom_address":3214736,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3247740},{"battle_script_rom_address":2161586,"party":[{"level":17,"moves":[117,197,93,9],"species":356},{"level":17,"moves":[9,197,93,96],"species":356}],"party_rom_address":3214752,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3247780},{"battle_script_rom_address":2097491,"party":[{"level":23,"moves":[117,197,93,7],"species":356}],"party_rom_address":3214784,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3247820},{"battle_script_rom_address":2055519,"party":[{"level":25,"moves":[33,120,124,108],"species":109},{"level":25,"moves":[33,139,124,108],"species":109}],"party_rom_address":3214800,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3247860},{"battle_script_rom_address":2059810,"party":[{"level":28,"moves":[139,120,124,108],"species":109},{"level":28,"moves":[28,104,210,14],"species":302}],"party_rom_address":3214832,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3247900},{"battle_script_rom_address":2059841,"party":[{"level":28,"moves":[141,154,170,91],"species":301},{"level":28,"moves":[33,120,124,108],"species":109}],"party_rom_address":3214864,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3247940},{"battle_script_rom_address":2196154,"party":[{"level":29,"moves":[0,0,0,0],"species":305},{"level":29,"moves":[0,0,0,0],"species":178}],"party_rom_address":3214896,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3247980},{"battle_script_rom_address":2196185,"party":[{"level":27,"moves":[0,0,0,0],"species":358},{"level":27,"moves":[0,0,0,0],"species":358},{"level":27,"moves":[0,0,0,0],"species":358}],"party_rom_address":3214912,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248020},{"battle_script_rom_address":1966818,"party":[{"level":16,"moves":[0,0,0,0],"species":392}],"party_rom_address":3214936,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248060},{"battle_script_rom_address":2326195,"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_rom_address":3214944,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3248100},{"battle_script_rom_address":0,"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_rom_address":3215024,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3248140},{"battle_script_rom_address":0,"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_rom_address":3215104,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3248180},{"battle_script_rom_address":0,"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_rom_address":3215184,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3248220},{"battle_script_rom_address":1981539,"party":[{"level":31,"moves":[0,0,0,0],"species":369},{"level":32,"moves":[0,0,0,0],"species":218},{"level":32,"moves":[0,0,0,0],"species":310},{"level":34,"moves":[0,0,0,0],"species":278}],"party_rom_address":3215264,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248260},{"battle_script_rom_address":1981483,"party":[{"level":31,"moves":[0,0,0,0],"species":369},{"level":32,"moves":[0,0,0,0],"species":310},{"level":32,"moves":[0,0,0,0],"species":297},{"level":34,"moves":[0,0,0,0],"species":281}],"party_rom_address":3215296,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248300},{"battle_script_rom_address":1981511,"party":[{"level":31,"moves":[0,0,0,0],"species":369},{"level":32,"moves":[0,0,0,0],"species":297},{"level":32,"moves":[0,0,0,0],"species":218},{"level":34,"moves":[0,0,0,0],"species":284}],"party_rom_address":3215328,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248340},{"battle_script_rom_address":1981455,"party":[{"level":31,"moves":[0,0,0,0],"species":369},{"level":32,"moves":[0,0,0,0],"species":218},{"level":32,"moves":[0,0,0,0],"species":310},{"level":34,"moves":[0,0,0,0],"species":278}],"party_rom_address":3215360,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248380},{"battle_script_rom_address":1981399,"party":[{"level":31,"moves":[0,0,0,0],"species":369},{"level":32,"moves":[0,0,0,0],"species":310},{"level":32,"moves":[0,0,0,0],"species":297},{"level":34,"moves":[0,0,0,0],"species":281}],"party_rom_address":3215392,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248420},{"battle_script_rom_address":1981427,"party":[{"level":31,"moves":[0,0,0,0],"species":369},{"level":32,"moves":[0,0,0,0],"species":297},{"level":32,"moves":[0,0,0,0],"species":218},{"level":34,"moves":[0,0,0,0],"species":284}],"party_rom_address":3215424,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248460},{"battle_script_rom_address":2064677,"party":[{"level":30,"moves":[0,0,0,0],"species":313},{"level":31,"moves":[0,0,0,0],"species":72},{"level":32,"moves":[0,0,0,0],"species":331}],"party_rom_address":3215456,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248500},{"battle_script_rom_address":2064708,"party":[{"level":31,"moves":[0,0,0,0],"species":330},{"level":34,"moves":[0,0,0,0],"species":73}],"party_rom_address":3215480,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248540},{"battle_script_rom_address":2064739,"party":[{"level":15,"moves":[0,0,0,0],"species":129},{"level":25,"moves":[0,0,0,0],"species":129},{"level":35,"moves":[0,0,0,0],"species":130}],"party_rom_address":3215496,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248580},{"battle_script_rom_address":2065552,"party":[{"level":34,"moves":[0,0,0,0],"species":44},{"level":34,"moves":[0,0,0,0],"species":184}],"party_rom_address":3215520,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248620},{"battle_script_rom_address":2065583,"party":[{"level":34,"moves":[0,0,0,0],"species":300},{"level":34,"moves":[0,0,0,0],"species":320}],"party_rom_address":3215536,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248660},{"battle_script_rom_address":2064832,"party":[{"level":34,"moves":[0,0,0,0],"species":67}],"party_rom_address":3215552,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248700},{"battle_script_rom_address":2065614,"party":[{"level":31,"moves":[0,0,0,0],"species":72},{"level":31,"moves":[0,0,0,0],"species":72},{"level":36,"moves":[0,0,0,0],"species":313}],"party_rom_address":3215560,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248740},{"battle_script_rom_address":2064770,"party":[{"level":32,"moves":[0,0,0,0],"species":305},{"level":32,"moves":[0,0,0,0],"species":227}],"party_rom_address":3215584,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248780},{"battle_script_rom_address":2067040,"party":[{"level":33,"moves":[0,0,0,0],"species":341},{"level":33,"moves":[0,0,0,0],"species":331}],"party_rom_address":3215600,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248820},{"battle_script_rom_address":2067071,"party":[{"level":34,"moves":[0,0,0,0],"species":170}],"party_rom_address":3215616,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248860},{"battle_script_rom_address":0,"party":[{"level":19,"moves":[0,0,0,0],"species":308},{"level":19,"moves":[0,0,0,0],"species":308}],"party_rom_address":3215624,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3248900},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[47,31,219,76],"species":358},{"level":35,"moves":[53,36,156,89],"species":339}],"party_rom_address":3215640,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3248940},{"battle_script_rom_address":0,"party":[{"level":18,"moves":[74,78,72,73],"species":363},{"level":20,"moves":[111,205,44,88],"species":75}],"party_rom_address":3215672,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3248980},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[16,60,92,182],"species":294},{"level":27,"moves":[16,72,213,78],"species":292}],"party_rom_address":3215704,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3249020},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[94,7,244,182],"species":357},{"level":39,"moves":[8,61,156,187],"species":336}],"party_rom_address":3215736,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3249060},{"battle_script_rom_address":0,"party":[{"level":43,"moves":[94,7,244,182],"species":357},{"level":43,"moves":[8,61,156,187],"species":336}],"party_rom_address":3215768,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3249100},{"battle_script_rom_address":0,"party":[{"level":46,"moves":[94,7,244,182],"species":357},{"level":46,"moves":[8,61,156,187],"species":336}],"party_rom_address":3215800,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3249140},{"battle_script_rom_address":0,"party":[{"level":49,"moves":[94,7,244,182],"species":357},{"level":49,"moves":[8,61,156,187],"species":336}],"party_rom_address":3215832,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3249180},{"battle_script_rom_address":0,"party":[{"level":52,"moves":[94,7,244,182],"species":357},{"level":52,"moves":[8,61,156,187],"species":336}],"party_rom_address":3215864,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3249220},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":184},{"level":33,"moves":[0,0,0,0],"species":309}],"party_rom_address":3215896,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249260},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":170},{"level":33,"moves":[0,0,0,0],"species":330}],"party_rom_address":3215912,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249300},{"battle_script_rom_address":0,"party":[{"level":42,"moves":[0,0,0,0],"species":170},{"level":40,"moves":[0,0,0,0],"species":330}],"party_rom_address":3215928,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249340},{"battle_script_rom_address":0,"party":[{"level":45,"moves":[0,0,0,0],"species":171},{"level":43,"moves":[0,0,0,0],"species":330}],"party_rom_address":3215944,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249380},{"battle_script_rom_address":0,"party":[{"level":48,"moves":[0,0,0,0],"species":171},{"level":46,"moves":[0,0,0,0],"species":331}],"party_rom_address":3215960,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249420},{"battle_script_rom_address":0,"party":[{"level":51,"moves":[0,0,0,0],"species":171},{"level":49,"moves":[0,0,0,0],"species":331}],"party_rom_address":3215976,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249460},{"battle_script_rom_address":0,"party":[{"level":27,"moves":[0,0,0,0],"species":118},{"level":25,"moves":[0,0,0,0],"species":72}],"party_rom_address":3215992,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249500},{"battle_script_rom_address":2055550,"party":[{"level":29,"moves":[0,0,0,0],"species":129},{"level":20,"moves":[0,0,0,0],"species":72},{"level":26,"moves":[0,0,0,0],"species":328},{"level":23,"moves":[0,0,0,0],"species":330}],"party_rom_address":3216008,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249540},{"battle_script_rom_address":2048807,"party":[{"level":8,"moves":[0,0,0,0],"species":288},{"level":8,"moves":[0,0,0,0],"species":286}],"party_rom_address":3216040,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3249580},{"battle_script_rom_address":2048776,"party":[{"level":8,"moves":[0,0,0,0],"species":295},{"level":8,"moves":[0,0,0,0],"species":288}],"party_rom_address":3216056,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3249620},{"battle_script_rom_address":2024517,"party":[{"level":9,"moves":[0,0,0,0],"species":129}],"party_rom_address":3216072,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249660},{"battle_script_rom_address":2030479,"party":[{"level":13,"moves":[0,0,0,0],"species":183}],"party_rom_address":3216080,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249700},{"battle_script_rom_address":2030448,"party":[{"level":12,"moves":[0,0,0,0],"species":72},{"level":12,"moves":[0,0,0,0],"species":72}],"party_rom_address":3216088,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249740},{"battle_script_rom_address":2033204,"party":[{"level":14,"moves":[0,0,0,0],"species":354},{"level":14,"moves":[0,0,0,0],"species":353}],"party_rom_address":3216104,"pokemon_data_type":"ITEM_DEFAULT_MOVES","rom_address":3249780},{"battle_script_rom_address":2033235,"party":[{"level":14,"moves":[0,0,0,0],"species":337},{"level":14,"moves":[0,0,0,0],"species":100}],"party_rom_address":3216120,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249820},{"battle_script_rom_address":2033266,"party":[{"level":15,"moves":[0,0,0,0],"species":81}],"party_rom_address":3216136,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249860},{"battle_script_rom_address":2020630,"party":[{"level":15,"moves":[0,0,0,0],"species":100}],"party_rom_address":3216144,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249900},{"battle_script_rom_address":2020661,"party":[{"level":15,"moves":[0,0,0,0],"species":335}],"party_rom_address":3216152,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249940},{"battle_script_rom_address":2041104,"party":[{"level":19,"moves":[0,0,0,0],"species":27}],"party_rom_address":3216160,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3249980},{"battle_script_rom_address":2041135,"party":[{"level":18,"moves":[0,0,0,0],"species":363}],"party_rom_address":3216168,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250020},{"battle_script_rom_address":2041073,"party":[{"level":18,"moves":[0,0,0,0],"species":306}],"party_rom_address":3216176,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250060},{"battle_script_rom_address":2041042,"party":[{"level":18,"moves":[0,0,0,0],"species":339}],"party_rom_address":3216184,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250100},{"battle_script_rom_address":2045098,"party":[{"level":17,"moves":[0,0,0,0],"species":183},{"level":19,"moves":[0,0,0,0],"species":296}],"party_rom_address":3216192,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250140},{"battle_script_rom_address":2045129,"party":[{"level":17,"moves":[0,0,0,0],"species":227},{"level":19,"moves":[0,0,0,0],"species":305}],"party_rom_address":3216208,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250180},{"battle_script_rom_address":2045160,"party":[{"level":18,"moves":[0,0,0,0],"species":318},{"level":18,"moves":[0,0,0,0],"species":27}],"party_rom_address":3216224,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250220},{"battle_script_rom_address":2045191,"party":[{"level":18,"moves":[0,0,0,0],"species":382},{"level":18,"moves":[0,0,0,0],"species":382}],"party_rom_address":3216240,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250260},{"battle_script_rom_address":2046431,"party":[{"level":18,"moves":[0,0,0,0],"species":296},{"level":18,"moves":[0,0,0,0],"species":183}],"party_rom_address":3216256,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250300},{"battle_script_rom_address":2046493,"party":[{"level":19,"moves":[0,0,0,0],"species":323}],"party_rom_address":3216272,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250340},{"battle_script_rom_address":2046462,"party":[{"level":19,"moves":[0,0,0,0],"species":299}],"party_rom_address":3216280,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250380},{"battle_script_rom_address":2053150,"party":[{"level":14,"moves":[0,0,0,0],"species":288},{"level":14,"moves":[0,0,0,0],"species":382},{"level":14,"moves":[0,0,0,0],"species":337}],"party_rom_address":3216288,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250420},{"battle_script_rom_address":2341334,"party":[{"level":29,"moves":[0,0,0,0],"species":41}],"party_rom_address":3216312,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250460},{"battle_script_rom_address":2341365,"party":[{"level":29,"moves":[0,0,0,0],"species":286}],"party_rom_address":3216320,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250500},{"battle_script_rom_address":2342090,"party":[{"level":29,"moves":[0,0,0,0],"species":339}],"party_rom_address":3216328,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250540},{"battle_script_rom_address":2342121,"party":[{"level":28,"moves":[0,0,0,0],"species":318},{"level":28,"moves":[0,0,0,0],"species":41}],"party_rom_address":3216336,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250580},{"battle_script_rom_address":2342152,"party":[{"level":28,"moves":[0,0,0,0],"species":318},{"level":28,"moves":[0,0,0,0],"species":339}],"party_rom_address":3216352,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250620},{"battle_script_rom_address":2342817,"party":[{"level":29,"moves":[0,0,0,0],"species":287}],"party_rom_address":3216368,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250660},{"battle_script_rom_address":2342848,"party":[{"level":29,"moves":[0,0,0,0],"species":41}],"party_rom_address":3216376,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250700},{"battle_script_rom_address":2342879,"party":[{"level":29,"moves":[0,0,0,0],"species":286}],"party_rom_address":3216384,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250740},{"battle_script_rom_address":2343757,"party":[{"level":29,"moves":[0,0,0,0],"species":41}],"party_rom_address":3216392,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250780},{"battle_script_rom_address":2344319,"party":[{"level":29,"moves":[0,0,0,0],"species":287}],"party_rom_address":3216400,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250820},{"battle_script_rom_address":2345034,"party":[{"level":29,"moves":[0,0,0,0],"species":318}],"party_rom_address":3216408,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250860},{"battle_script_rom_address":2345065,"party":[{"level":29,"moves":[0,0,0,0],"species":339}],"party_rom_address":3216416,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250900},{"battle_script_rom_address":2345096,"party":[{"level":29,"moves":[0,0,0,0],"species":41}],"party_rom_address":3216424,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250940},{"battle_script_rom_address":2342059,"party":[{"level":29,"moves":[0,0,0,0],"species":287}],"party_rom_address":3216432,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3250980},{"battle_script_rom_address":2342786,"party":[{"level":29,"moves":[0,0,0,0],"species":339}],"party_rom_address":3216440,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251020},{"battle_script_rom_address":2343788,"party":[{"level":29,"moves":[0,0,0,0],"species":318}],"party_rom_address":3216448,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251060},{"battle_script_rom_address":2345127,"party":[{"level":26,"moves":[0,0,0,0],"species":339},{"level":28,"moves":[0,0,0,0],"species":287},{"level":30,"moves":[0,0,0,0],"species":41},{"level":33,"moves":[0,0,0,0],"species":340}],"party_rom_address":3216456,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251100},{"battle_script_rom_address":2067763,"party":[{"level":33,"moves":[0,0,0,0],"species":310},{"level":33,"moves":[0,0,0,0],"species":340}],"party_rom_address":3216488,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251140},{"battle_script_rom_address":0,"party":[{"level":42,"moves":[0,0,0,0],"species":287},{"level":43,"moves":[0,0,0,0],"species":169},{"level":44,"moves":[0,0,0,0],"species":340}],"party_rom_address":3216504,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251180},{"battle_script_rom_address":2020692,"party":[{"level":15,"moves":[0,0,0,0],"species":72}],"party_rom_address":3216528,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251220},{"battle_script_rom_address":2020723,"party":[{"level":15,"moves":[0,0,0,0],"species":183}],"party_rom_address":3216536,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251260},{"battle_script_rom_address":2027900,"party":[{"level":25,"moves":[0,0,0,0],"species":27},{"level":25,"moves":[0,0,0,0],"species":27}],"party_rom_address":3216544,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251300},{"battle_script_rom_address":2027869,"party":[{"level":25,"moves":[0,0,0,0],"species":304},{"level":25,"moves":[0,0,0,0],"species":309}],"party_rom_address":3216560,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251340},{"battle_script_rom_address":2028918,"party":[{"level":26,"moves":[0,0,0,0],"species":120}],"party_rom_address":3216576,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251380},{"battle_script_rom_address":2029105,"party":[{"level":24,"moves":[0,0,0,0],"species":309},{"level":24,"moves":[0,0,0,0],"species":66},{"level":24,"moves":[0,0,0,0],"species":72}],"party_rom_address":3216584,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251420},{"battle_script_rom_address":2029074,"party":[{"level":24,"moves":[0,0,0,0],"species":338},{"level":24,"moves":[0,0,0,0],"species":305},{"level":24,"moves":[0,0,0,0],"species":338}],"party_rom_address":3216608,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251460},{"battle_script_rom_address":2030510,"party":[{"level":25,"moves":[0,0,0,0],"species":227},{"level":25,"moves":[0,0,0,0],"species":227}],"party_rom_address":3216632,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251500},{"battle_script_rom_address":2041166,"party":[{"level":22,"moves":[0,0,0,0],"species":183},{"level":22,"moves":[0,0,0,0],"species":296}],"party_rom_address":3216648,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251540},{"battle_script_rom_address":2041197,"party":[{"level":22,"moves":[0,0,0,0],"species":27},{"level":22,"moves":[0,0,0,0],"species":28}],"party_rom_address":3216664,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251580},{"battle_script_rom_address":2041228,"party":[{"level":22,"moves":[0,0,0,0],"species":304},{"level":22,"moves":[0,0,0,0],"species":299}],"party_rom_address":3216680,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251620},{"battle_script_rom_address":2044020,"party":[{"level":18,"moves":[0,0,0,0],"species":339},{"level":18,"moves":[0,0,0,0],"species":218}],"party_rom_address":3216696,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251660},{"battle_script_rom_address":2044051,"party":[{"level":18,"moves":[0,0,0,0],"species":306},{"level":18,"moves":[0,0,0,0],"species":363}],"party_rom_address":3216712,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251700},{"battle_script_rom_address":2047305,"party":[{"level":26,"moves":[0,0,0,0],"species":84},{"level":26,"moves":[0,0,0,0],"species":85}],"party_rom_address":3216728,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251740},{"battle_script_rom_address":2047336,"party":[{"level":26,"moves":[0,0,0,0],"species":302},{"level":26,"moves":[0,0,0,0],"species":367}],"party_rom_address":3216744,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251780},{"battle_script_rom_address":2047367,"party":[{"level":26,"moves":[0,0,0,0],"species":64},{"level":26,"moves":[0,0,0,0],"species":393}],"party_rom_address":3216760,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251820},{"battle_script_rom_address":2047398,"party":[{"level":26,"moves":[0,0,0,0],"species":356},{"level":26,"moves":[0,0,0,0],"species":335}],"party_rom_address":3216776,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251860},{"battle_script_rom_address":2047429,"party":[{"level":18,"moves":[0,0,0,0],"species":356},{"level":18,"moves":[0,0,0,0],"species":351}],"party_rom_address":3216792,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251900},{"battle_script_rom_address":2048838,"party":[{"level":8,"moves":[0,0,0,0],"species":74},{"level":8,"moves":[0,0,0,0],"species":74}],"party_rom_address":3216808,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251940},{"battle_script_rom_address":2048869,"party":[{"level":8,"moves":[0,0,0,0],"species":306},{"level":8,"moves":[0,0,0,0],"species":295}],"party_rom_address":3216824,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3251980},{"battle_script_rom_address":2051934,"party":[{"level":17,"moves":[0,0,0,0],"species":84}],"party_rom_address":3216840,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252020},{"battle_script_rom_address":2051965,"party":[{"level":17,"moves":[0,0,0,0],"species":392}],"party_rom_address":3216848,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252060},{"battle_script_rom_address":2051996,"party":[{"level":17,"moves":[0,0,0,0],"species":356}],"party_rom_address":3216856,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252100},{"battle_script_rom_address":2067825,"party":[{"level":33,"moves":[0,0,0,0],"species":363},{"level":33,"moves":[0,0,0,0],"species":357}],"party_rom_address":3216864,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252140},{"battle_script_rom_address":2055581,"party":[{"level":26,"moves":[0,0,0,0],"species":338}],"party_rom_address":3216880,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252180},{"battle_script_rom_address":2055612,"party":[{"level":25,"moves":[0,0,0,0],"species":218},{"level":25,"moves":[0,0,0,0],"species":339}],"party_rom_address":3216888,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252220},{"battle_script_rom_address":2055643,"party":[{"level":26,"moves":[0,0,0,0],"species":118}],"party_rom_address":3216904,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252260},{"battle_script_rom_address":2059872,"party":[{"level":30,"moves":[87,98,86,0],"species":338}],"party_rom_address":3216912,"pokemon_data_type":"NO_ITEM_CUSTOM_MOVES","rom_address":3252300},{"battle_script_rom_address":2059903,"party":[{"level":28,"moves":[0,0,0,0],"species":356},{"level":28,"moves":[0,0,0,0],"species":335}],"party_rom_address":3216928,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252340},{"battle_script_rom_address":2061522,"party":[{"level":29,"moves":[0,0,0,0],"species":294},{"level":29,"moves":[0,0,0,0],"species":292}],"party_rom_address":3216944,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252380},{"battle_script_rom_address":2061553,"party":[{"level":25,"moves":[0,0,0,0],"species":335},{"level":25,"moves":[0,0,0,0],"species":309},{"level":25,"moves":[0,0,0,0],"species":369},{"level":25,"moves":[0,0,0,0],"species":288},{"level":25,"moves":[0,0,0,0],"species":337},{"level":25,"moves":[0,0,0,0],"species":339}],"party_rom_address":3216960,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252420},{"battle_script_rom_address":2061584,"party":[{"level":25,"moves":[0,0,0,0],"species":286},{"level":25,"moves":[0,0,0,0],"species":306},{"level":25,"moves":[0,0,0,0],"species":337},{"level":25,"moves":[0,0,0,0],"species":183},{"level":25,"moves":[0,0,0,0],"species":27},{"level":25,"moves":[0,0,0,0],"species":367}],"party_rom_address":3217008,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252460},{"battle_script_rom_address":2061646,"party":[{"level":29,"moves":[0,0,0,0],"species":371},{"level":29,"moves":[0,0,0,0],"species":365}],"party_rom_address":3217056,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252500},{"battle_script_rom_address":1973644,"party":[{"level":13,"moves":[0,0,0,0],"species":295},{"level":15,"moves":[0,0,0,0],"species":280}],"party_rom_address":3217072,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252540},{"battle_script_rom_address":1973675,"party":[{"level":13,"moves":[0,0,0,0],"species":321},{"level":15,"moves":[0,0,0,0],"species":283}],"party_rom_address":3217088,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3252580},{"battle_script_rom_address":0,"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_rom_address":3217104,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3252620},{"battle_script_rom_address":0,"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_rom_address":3217168,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3252660},{"battle_script_rom_address":0,"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_rom_address":3217248,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3252700},{"battle_script_rom_address":0,"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_rom_address":3217328,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3252740},{"battle_script_rom_address":0,"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_rom_address":3217424,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3252780},{"battle_script_rom_address":0,"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_rom_address":3217488,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3252820},{"battle_script_rom_address":0,"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_rom_address":3217552,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3252860},{"battle_script_rom_address":0,"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_rom_address":3217632,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3252900},{"battle_script_rom_address":0,"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_rom_address":3217728,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3252940},{"battle_script_rom_address":0,"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_rom_address":3217792,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3252980},{"battle_script_rom_address":0,"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_rom_address":3217872,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253020},{"battle_script_rom_address":0,"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_rom_address":3217952,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253060},{"battle_script_rom_address":0,"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_rom_address":3218048,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253100},{"battle_script_rom_address":0,"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_rom_address":3218112,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253140},{"battle_script_rom_address":0,"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_rom_address":3218192,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253180},{"battle_script_rom_address":0,"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_rom_address":3218288,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253220},{"battle_script_rom_address":0,"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_rom_address":3218384,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253260},{"battle_script_rom_address":0,"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_rom_address":3218448,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253300},{"battle_script_rom_address":0,"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_rom_address":3218528,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253340},{"battle_script_rom_address":0,"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_rom_address":3218608,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253380},{"battle_script_rom_address":0,"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_rom_address":3218704,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253420},{"battle_script_rom_address":0,"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_rom_address":3218784,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253460},{"battle_script_rom_address":0,"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_rom_address":3218880,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253500},{"battle_script_rom_address":0,"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_rom_address":3218976,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253540},{"battle_script_rom_address":0,"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_rom_address":3219072,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253580},{"battle_script_rom_address":0,"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_rom_address":3219152,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253620},{"battle_script_rom_address":0,"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_rom_address":3219248,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253660},{"battle_script_rom_address":0,"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_rom_address":3219344,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253700},{"battle_script_rom_address":0,"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_rom_address":3219440,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253740},{"battle_script_rom_address":0,"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_rom_address":3219520,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253780},{"battle_script_rom_address":0,"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_rom_address":3219600,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253820},{"battle_script_rom_address":0,"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_rom_address":3219696,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253860},{"battle_script_rom_address":2161617,"party":[{"level":17,"moves":[95,98,204,0],"species":387},{"level":17,"moves":[95,98,109,0],"species":386}],"party_rom_address":3219792,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253900},{"battle_script_rom_address":2196247,"party":[{"level":30,"moves":[0,0,0,0],"species":369}],"party_rom_address":3219824,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3253940},{"battle_script_rom_address":2347924,"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_rom_address":3219832,"pokemon_data_type":"ITEM_CUSTOM_MOVES","rom_address":3253980},{"battle_script_rom_address":0,"party":[{"level":5,"moves":[0,0,0,0],"species":398}],"party_rom_address":3219928,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254020},{"battle_script_rom_address":0,"party":[{"level":5,"moves":[0,0,0,0],"species":398}],"party_rom_address":3219936,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254060},{"battle_script_rom_address":0,"party":[{"level":5,"moves":[0,0,0,0],"species":398}],"party_rom_address":3219944,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254100},{"battle_script_rom_address":0,"party":[{"level":5,"moves":[0,0,0,0],"species":398}],"party_rom_address":3219952,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254140},{"battle_script_rom_address":0,"party":[{"level":5,"moves":[0,0,0,0],"species":398}],"party_rom_address":3219960,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254180},{"battle_script_rom_address":0,"party":[{"level":5,"moves":[0,0,0,0],"species":398}],"party_rom_address":3219968,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254220},{"battle_script_rom_address":0,"party":[{"level":5,"moves":[0,0,0,0],"species":398}],"party_rom_address":3219976,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254260},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":27},{"level":31,"moves":[0,0,0,0],"species":27}],"party_rom_address":3219984,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254300},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":320},{"level":33,"moves":[0,0,0,0],"species":27},{"level":33,"moves":[0,0,0,0],"species":27}],"party_rom_address":3220000,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254340},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":320},{"level":35,"moves":[0,0,0,0],"species":27},{"level":35,"moves":[0,0,0,0],"species":27}],"party_rom_address":3220024,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254380},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":320},{"level":37,"moves":[0,0,0,0],"species":28},{"level":37,"moves":[0,0,0,0],"species":28}],"party_rom_address":3220048,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254420},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":309},{"level":30,"moves":[0,0,0,0],"species":66},{"level":30,"moves":[0,0,0,0],"species":72}],"party_rom_address":3220072,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254460},{"battle_script_rom_address":0,"party":[{"level":32,"moves":[0,0,0,0],"species":310},{"level":32,"moves":[0,0,0,0],"species":66},{"level":32,"moves":[0,0,0,0],"species":72}],"party_rom_address":3220096,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254500},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":310},{"level":34,"moves":[0,0,0,0],"species":66},{"level":34,"moves":[0,0,0,0],"species":73}],"party_rom_address":3220120,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254540},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[0,0,0,0],"species":310},{"level":36,"moves":[0,0,0,0],"species":67},{"level":36,"moves":[0,0,0,0],"species":73}],"party_rom_address":3220144,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254580},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":120},{"level":37,"moves":[0,0,0,0],"species":120}],"party_rom_address":3220168,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254620},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":309},{"level":39,"moves":[0,0,0,0],"species":120},{"level":39,"moves":[0,0,0,0],"species":120}],"party_rom_address":3220184,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254660},{"battle_script_rom_address":0,"party":[{"level":41,"moves":[0,0,0,0],"species":310},{"level":41,"moves":[0,0,0,0],"species":120},{"level":41,"moves":[0,0,0,0],"species":120}],"party_rom_address":3220208,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254700},{"battle_script_rom_address":0,"party":[{"level":43,"moves":[0,0,0,0],"species":310},{"level":43,"moves":[0,0,0,0],"species":121},{"level":43,"moves":[0,0,0,0],"species":121}],"party_rom_address":3220232,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254740},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":67},{"level":37,"moves":[0,0,0,0],"species":67}],"party_rom_address":3220256,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254780},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":335},{"level":39,"moves":[0,0,0,0],"species":67},{"level":39,"moves":[0,0,0,0],"species":67}],"party_rom_address":3220272,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254820},{"battle_script_rom_address":0,"party":[{"level":41,"moves":[0,0,0,0],"species":336},{"level":41,"moves":[0,0,0,0],"species":67},{"level":41,"moves":[0,0,0,0],"species":67}],"party_rom_address":3220296,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254860},{"battle_script_rom_address":0,"party":[{"level":43,"moves":[0,0,0,0],"species":336},{"level":43,"moves":[0,0,0,0],"species":68},{"level":43,"moves":[0,0,0,0],"species":68}],"party_rom_address":3220320,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254900},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":371},{"level":35,"moves":[0,0,0,0],"species":365}],"party_rom_address":3220344,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254940},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":308},{"level":37,"moves":[0,0,0,0],"species":371},{"level":37,"moves":[0,0,0,0],"species":365}],"party_rom_address":3220360,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3254980},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":308},{"level":39,"moves":[0,0,0,0],"species":371},{"level":39,"moves":[0,0,0,0],"species":365}],"party_rom_address":3220384,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255020},{"battle_script_rom_address":0,"party":[{"level":41,"moves":[0,0,0,0],"species":308},{"level":41,"moves":[0,0,0,0],"species":372},{"level":41,"moves":[0,0,0,0],"species":366}],"party_rom_address":3220408,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255060},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":337},{"level":35,"moves":[0,0,0,0],"species":337},{"level":35,"moves":[0,0,0,0],"species":371}],"party_rom_address":3220432,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255100},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":337},{"level":37,"moves":[0,0,0,0],"species":338},{"level":37,"moves":[0,0,0,0],"species":371}],"party_rom_address":3220456,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255140},{"battle_script_rom_address":0,"party":[{"level":39,"moves":[0,0,0,0],"species":338},{"level":39,"moves":[0,0,0,0],"species":338},{"level":39,"moves":[0,0,0,0],"species":371}],"party_rom_address":3220480,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255180},{"battle_script_rom_address":0,"party":[{"level":41,"moves":[0,0,0,0],"species":338},{"level":41,"moves":[0,0,0,0],"species":338},{"level":41,"moves":[0,0,0,0],"species":372}],"party_rom_address":3220504,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255220},{"battle_script_rom_address":0,"party":[{"level":26,"moves":[0,0,0,0],"species":74},{"level":26,"moves":[0,0,0,0],"species":339}],"party_rom_address":3220528,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255260},{"battle_script_rom_address":0,"party":[{"level":28,"moves":[0,0,0,0],"species":66},{"level":28,"moves":[0,0,0,0],"species":339},{"level":28,"moves":[0,0,0,0],"species":75}],"party_rom_address":3220544,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255300},{"battle_script_rom_address":0,"party":[{"level":30,"moves":[0,0,0,0],"species":66},{"level":30,"moves":[0,0,0,0],"species":339},{"level":30,"moves":[0,0,0,0],"species":75}],"party_rom_address":3220568,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255340},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":67},{"level":33,"moves":[0,0,0,0],"species":340},{"level":33,"moves":[0,0,0,0],"species":76}],"party_rom_address":3220592,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255380},{"battle_script_rom_address":0,"party":[{"level":31,"moves":[0,0,0,0],"species":315},{"level":31,"moves":[0,0,0,0],"species":287},{"level":31,"moves":[0,0,0,0],"species":288},{"level":31,"moves":[0,0,0,0],"species":295},{"level":31,"moves":[0,0,0,0],"species":298},{"level":31,"moves":[0,0,0,0],"species":304}],"party_rom_address":3220616,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255420},{"battle_script_rom_address":0,"party":[{"level":33,"moves":[0,0,0,0],"species":315},{"level":33,"moves":[0,0,0,0],"species":287},{"level":33,"moves":[0,0,0,0],"species":289},{"level":33,"moves":[0,0,0,0],"species":296},{"level":33,"moves":[0,0,0,0],"species":299},{"level":33,"moves":[0,0,0,0],"species":304}],"party_rom_address":3220664,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255460},{"battle_script_rom_address":0,"party":[{"level":35,"moves":[0,0,0,0],"species":316},{"level":35,"moves":[0,0,0,0],"species":287},{"level":35,"moves":[0,0,0,0],"species":289},{"level":35,"moves":[0,0,0,0],"species":296},{"level":35,"moves":[0,0,0,0],"species":299},{"level":35,"moves":[0,0,0,0],"species":305}],"party_rom_address":3220712,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255500},{"battle_script_rom_address":0,"party":[{"level":37,"moves":[0,0,0,0],"species":316},{"level":37,"moves":[0,0,0,0],"species":287},{"level":37,"moves":[0,0,0,0],"species":289},{"level":37,"moves":[0,0,0,0],"species":297},{"level":37,"moves":[0,0,0,0],"species":300},{"level":37,"moves":[0,0,0,0],"species":305}],"party_rom_address":3220760,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255540},{"battle_script_rom_address":0,"party":[{"level":34,"moves":[0,0,0,0],"species":313},{"level":34,"moves":[0,0,0,0],"species":116}],"party_rom_address":3220808,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255580},{"battle_script_rom_address":0,"party":[{"level":36,"moves":[0,0,0,0],"species":325},{"level":36,"moves":[0,0,0,0],"species":313},{"level":36,"moves":[0,0,0,0],"species":117}],"party_rom_address":3220824,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255620},{"battle_script_rom_address":0,"party":[{"level":38,"moves":[0,0,0,0],"species":325},{"level":38,"moves":[0,0,0,0],"species":313},{"level":38,"moves":[0,0,0,0],"species":117}],"party_rom_address":3220848,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255660},{"battle_script_rom_address":0,"party":[{"level":40,"moves":[0,0,0,0],"species":325},{"level":40,"moves":[0,0,0,0],"species":314},{"level":40,"moves":[0,0,0,0],"species":230}],"party_rom_address":3220872,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255700},{"battle_script_rom_address":2557618,"party":[{"level":41,"moves":[0,0,0,0],"species":411}],"party_rom_address":3220896,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255740},{"battle_script_rom_address":2557649,"party":[{"level":41,"moves":[0,0,0,0],"species":378},{"level":41,"moves":[0,0,0,0],"species":64}],"party_rom_address":3220904,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255780},{"battle_script_rom_address":0,"party":[{"level":41,"moves":[0,0,0,0],"species":202}],"party_rom_address":3220920,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255820},{"battle_script_rom_address":0,"party":[{"level":5,"moves":[0,0,0,0],"species":4}],"party_rom_address":3220928,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255860},{"battle_script_rom_address":0,"party":[{"level":5,"moves":[0,0,0,0],"species":1}],"party_rom_address":3220936,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255900},{"battle_script_rom_address":0,"party":[{"level":5,"moves":[0,0,0,0],"species":405}],"party_rom_address":3220944,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255940},{"battle_script_rom_address":0,"party":[{"level":5,"moves":[0,0,0,0],"species":404}],"party_rom_address":3220952,"pokemon_data_type":"NO_ITEM_DEFAULT_MOVES","rom_address":3255980}],"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/data/items.json b/worlds/pokemon_emerald/data/items.json new file mode 100644 index 000000000000..cea72eb65047 --- /dev/null +++ b/worlds/pokemon_emerald/data/items.json @@ -0,0 +1,1481 @@ +{ + "ITEM_BADGE_1": { + "label": "Stone Badge", + "classification": "PROGRESSION", + "tags": ["Badge", "Unique"] + }, + "ITEM_BADGE_2": { + "label": "Knuckle Badge", + "classification": "PROGRESSION", + "tags": ["Badge", "Unique"] + }, + "ITEM_BADGE_3": { + "label": "Dynamo Badge", + "classification": "PROGRESSION", + "tags": ["Badge", "Unique"] + }, + "ITEM_BADGE_4": { + "label": "Heat Badge", + "classification": "PROGRESSION", + "tags": ["Badge", "Unique"] + }, + "ITEM_BADGE_5": { + "label": "Balance Badge", + "classification": "PROGRESSION", + "tags": ["Badge", "Unique"] + }, + "ITEM_BADGE_6": { + "label": "Feather Badge", + "classification": "PROGRESSION", + "tags": ["Badge", "Unique"] + }, + "ITEM_BADGE_7": { + "label": "Mind Badge", + "classification": "PROGRESSION", + "tags": ["Badge", "Unique"] + }, + "ITEM_BADGE_8": { + "label": "Rain Badge", + "classification": "PROGRESSION", + "tags": ["Badge", "Unique"] + }, + + + "ITEM_HM01_CUT": { + "label": "HM01 Cut", + "classification": "PROGRESSION", + "tags": ["HM", "Unique"] + }, + "ITEM_HM02_FLY": { + "label": "HM02 Fly", + "classification": "PROGRESSION", + "tags": ["HM", "Unique"] + }, + "ITEM_HM03_SURF": { + "label": "HM03 Surf", + "classification": "PROGRESSION", + "tags": ["HM", "Unique"] + }, + "ITEM_HM04_STRENGTH": { + "label": "HM04 Strength", + "classification": "PROGRESSION", + "tags": ["HM", "Unique"] + }, + "ITEM_HM05_FLASH": { + "label": "HM05 Flash", + "classification": "PROGRESSION", + "tags": ["HM", "Unique"] + }, + "ITEM_HM06_ROCK_SMASH": { + "label": "HM06 Rock Smash", + "classification": "PROGRESSION", + "tags": ["HM", "Unique"] + }, + "ITEM_HM07_WATERFALL": { + "label": "HM07 Waterfall", + "classification": "PROGRESSION", + "tags": ["HM", "Unique"] + }, + "ITEM_HM08_DIVE": { + "label": "HM08 Dive", + "classification": "PROGRESSION", + "tags": ["HM", "Unique"] + }, + + + "ITEM_MACH_BIKE": { + "label": "Mach Bike", + "classification": "PROGRESSION", + "tags": ["Bike", "Unique"] + }, + "ITEM_ACRO_BIKE": { + "label": "Acro Bike", + "classification": "PROGRESSION", + "tags": ["Bike", "Unique"] + }, + + + "ITEM_DEVON_GOODS": { + "label": "Devon Goods", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_LETTER": { + "label": "Letter", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_ITEMFINDER": { + "label": "Itemfinder", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_METEORITE": { + "label": "Meteorite", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_GO_GOGGLES": { + "label": "Go Goggles", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_ROOM_1_KEY": { + "label": "Room 1 Key", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_ROOM_2_KEY": { + "label": "Room 2 Key", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_ROOM_4_KEY": { + "label": "Room 4 Key", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_ROOM_6_KEY": { + "label": "Room 6 Key", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_STORAGE_KEY": { + "label": "Storage Key", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_SCANNER": { + "label": "Scanner", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_BASEMENT_KEY": { + "label": "Basement Key", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_DEVON_SCOPE": { + "label": "Devon Scope", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_MAGMA_EMBLEM": { + "label": "Magma Emblem", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_POKEBLOCK_CASE": { + "label": "Pokeblock Case", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_SS_TICKET": { + "label": "S.S. Ticket", + "classification": "PROGRESSION", + "tags": ["Unique"] + }, + "ITEM_WAILMER_PAIL": { + "label": "Wailmer Pail", + "classification": "USEFUL", + "tags": ["Unique"] + }, + + + "ITEM_POWDER_JAR": { + "label": "Powder Jar", + "classification": "FILLER", + "tags": ["Unique"] + }, + "ITEM_COIN_CASE": { + "label": "Coin Case", + "classification": "FILLER", + "tags": ["Unique"] + }, + "ITEM_CONTEST_PASS": { + "label": "Contest Pass", + "classification": "FILLER", + "tags": ["Unique"] + }, + "ITEM_SOOT_SACK": { + "label": "Soot Sack", + "classification": "FILLER", + "tags": ["Unique"] + }, + "ITEM_ROOT_FOSSIL": { + "label": "Root Fossil", + "classification": "FILLER", + "tags": ["Unique"] + }, + "ITEM_CLAW_FOSSIL": { + "label": "Claw Fossil", + "classification": "FILLER", + "tags": ["Unique"] + }, + "ITEM_EON_TICKET": { + "label": "Eon Ticket", + "classification": "FILLER", + "tags": ["Unique"] + }, + "ITEM_OLD_SEA_MAP": { + "label": "Old Sea Map", + "classification": "FILLER", + "tags": ["Unique"] + }, + + + "ITEM_OLD_ROD": { + "label": "Old Rod", + "classification": "USEFUL", + "tags": ["Rod", "Unique"] + }, + "ITEM_GOOD_ROD": { + "label": "Good Rod", + "classification": "USEFUL", + "tags": ["Rod", "Unique"] + }, + "ITEM_SUPER_ROD": { + "label": "Super Rod", + "classification": "USEFUL", + "tags": ["Rod", "Unique"] + }, + + + "ITEM_MASTER_BALL": { + "label": "Master Ball", + "classification": "USEFUL", + "tags": ["Ball"] + }, + "ITEM_ULTRA_BALL": { + "label": "Ultra Ball", + "classification": "FILLER", + "tags": ["Ball"] + }, + "ITEM_GREAT_BALL": { + "label": "Great Ball", + "classification": "FILLER", + "tags": ["Ball"] + }, + "ITEM_POKE_BALL": { + "label": "Poke Ball", + "classification": "FILLER", + "tags": ["Ball"] + }, + "ITEM_SAFARI_BALL": { + "label": "Safari Ball", + "classification": "FILLER", + "tags": ["Ball"] + }, + "ITEM_NET_BALL": { + "label": "Net Ball", + "classification": "FILLER", + "tags": ["Ball"] + }, + "ITEM_DIVE_BALL": { + "label": "Dive Ball", + "classification": "FILLER", + "tags": ["Ball"] + }, + "ITEM_NEST_BALL": { + "label": "Nest Ball", + "classification": "FILLER", + "tags": ["Ball"] + }, + "ITEM_REPEAT_BALL": { + "label": "Repeat Ball", + "classification": "FILLER", + "tags": ["Ball"] + }, + "ITEM_TIMER_BALL": { + "label": "Timer Ball", + "classification": "FILLER", + "tags": ["Ball"] + }, + "ITEM_LUXURY_BALL": { + "label": "Luxury Ball", + "classification": "FILLER", + "tags": ["Ball"] + }, + "ITEM_PREMIER_BALL": { + "label": "Premier Ball", + "classification": "FILLER", + "tags": ["Ball"] + }, + + + "ITEM_POTION": { + "label": "Potion", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_ANTIDOTE": { + "label": "Antidote", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_BURN_HEAL": { + "label": "Burn Heal", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_ICE_HEAL": { + "label": "Ice Heal", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_AWAKENING": { + "label": "Awakening", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_PARALYZE_HEAL": { + "label": "Paralyze Heal", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_FULL_RESTORE": { + "label": "Full Restore", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_MAX_POTION": { + "label": "Max Potion", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_HYPER_POTION": { + "label": "Hyper Potion", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_SUPER_POTION": { + "label": "Super Potion", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_FULL_HEAL": { + "label": "Full Heal", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_REVIVE": { + "label": "Revive", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_MAX_REVIVE": { + "label": "Max Revive", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_FRESH_WATER": { + "label": "Fresh Water", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_SODA_POP": { + "label": "Soda Pop", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_LEMONADE": { + "label": "Lemonade", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_MOOMOO_MILK": { + "label": "Moomoo Milk", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_ENERGY_POWDER": { + "label": "Energy Powder", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_ENERGY_ROOT": { + "label": "Energy Root", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_HEAL_POWDER": { + "label": "Heal Powder", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_REVIVAL_HERB": { + "label": "Revival Herb", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_ETHER": { + "label": "Ether", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_MAX_ETHER": { + "label": "Max Ether", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_ELIXIR": { + "label": "Elixir", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_MAX_ELIXIR": { + "label": "Max Elixir", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_LAVA_COOKIE": { + "label": "Lava Cookie", + "classification": "FILLER", + "tags": ["Heal"] + }, + "ITEM_SACRED_ASH": { + "label": "Sacred Ash", + "classification": "USEFUL", + "tags": ["Heal"] + }, + + + "ITEM_BERRY_JUICE": { + "label": "Berry Juice", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_SHOAL_SALT": { + "label": "Shoal Salt", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_SHOAL_SHELL": { + "label": "Shoal Shell", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_RED_SHARD": { + "label": "Red Shard", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_BLUE_SHARD": { + "label": "Blue Shard", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_YELLOW_SHARD": { + "label": "Yellow Shard", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_GREEN_SHARD": { + "label": "Green Shard", + "classification": "FILLER", + "tags": ["Misc"] + }, + + + "ITEM_HP_UP": { + "label": "HP Up", + "classification": "FILLER", + "tags": ["Vitamin"] + }, + "ITEM_PROTEIN": { + "label": "Protein", + "classification": "FILLER", + "tags": ["Vitamin"] + }, + "ITEM_IRON": { + "label": "Iron", + "classification": "FILLER", + "tags": ["Vitamin"] + }, + "ITEM_CARBOS": { + "label": "Carbos", + "classification": "FILLER", + "tags": ["Vitamin"] + }, + "ITEM_CALCIUM": { + "label": "Calcium", + "classification": "FILLER", + "tags": ["Vitamin"] + }, + "ITEM_ZINC": { + "label": "Zinc", + "classification": "FILLER", + "tags": ["Vitamin"] + }, + "ITEM_PP_UP": { + "label": "PP Up", + "classification": "FILLER", + "tags": ["Vitamin"] + }, + "ITEM_PP_MAX": { + "label": "PP Max", + "classification": "FILLER", + "tags": ["Vitamin"] + }, + "ITEM_RARE_CANDY": { + "label": "Rare Candy", + "classification": "USEFUL", + "tags": ["Vitamin"] + }, + + + "ITEM_GUARD_SPEC": { + "label": "Guard Spec", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_DIRE_HIT": { + "label": "Dire Hit", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_X_ATTACK": { + "label": "X Attack", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_X_DEFEND": { + "label": "X Defend", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_X_SPEED": { + "label": "X Speed", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_X_ACCURACY": { + "label": "X Accuracy", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_X_SPECIAL": { + "label": "X Special", + "classification": "FILLER", + "tags": ["Misc"] + }, + + + "ITEM_REPEL": { + "label": "Repel", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_SUPER_REPEL": { + "label": "Super Repel", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_MAX_REPEL": { + "label": "Max Repel", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_POKE_DOLL": { + "label": "Poke Doll", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_FLUFFY_TAIL": { + "label": "Fluffy Tail", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_ESCAPE_ROPE": { + "label": "Escape Rope", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_BLUE_FLUTE": { + "label": "Blue Flute", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_YELLOW_FLUTE": { + "label": "Yellow Flute", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_RED_FLUTE": { + "label": "Red Flute", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_BLACK_FLUTE": { + "label": "Black Flute", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_WHITE_FLUTE": { + "label": "White Flute", + "classification": "FILLER", + "tags": ["Misc"] + }, + "ITEM_HEART_SCALE": { + "label": "Heart Scale", + "classification": "FILLER", + "tags": ["Misc"] + }, + + + "ITEM_SUN_STONE": { + "label": "Sun Stone", + "classification": "USEFUL", + "tags": ["EvoStone"] + }, + "ITEM_MOON_STONE": { + "label": "Moon Stone", + "classification": "USEFUL", + "tags": ["EvoStone"] + }, + "ITEM_FIRE_STONE": { + "label": "Fire Stone", + "classification": "USEFUL", + "tags": ["EvoStone"] + }, + "ITEM_THUNDER_STONE": { + "label": "Thunder Stone", + "classification": "USEFUL", + "tags": ["EvoStone"] + }, + "ITEM_WATER_STONE": { + "label": "Water Stone", + "classification": "USEFUL", + "tags": ["EvoStone"] + }, + "ITEM_LEAF_STONE": { + "label": "Leaf Stone", + "classification": "USEFUL", + "tags": ["EvoStone"] + }, + + + "ITEM_TINY_MUSHROOM": { + "label": "Tiny Mushroom", + "classification": "FILLER", + "tags": ["Money"] + }, + "ITEM_BIG_MUSHROOM": { + "label": "Big Mushroom", + "classification": "FILLER", + "tags": ["Money"] + }, + "ITEM_PEARL": { + "label": "Pearl", + "classification": "FILLER", + "tags": ["Money"] + }, + "ITEM_BIG_PEARL": { + "label": "Big Pearl", + "classification": "FILLER", + "tags": ["Money"] + }, + "ITEM_STARDUST": { + "label": "Stardust", + "classification": "FILLER", + "tags": ["Money"] + }, + "ITEM_STAR_PIECE": { + "label": "Star Piece", + "classification": "FILLER", + "tags": ["Money"] + }, + "ITEM_NUGGET": { + "label": "Nugget", + "classification": "FILLER", + "tags": ["Money"] + }, + + + "ITEM_ORANGE_MAIL": { + "label": "Orange Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + "ITEM_HARBOR_MAIL": { + "label": "Harbor Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + "ITEM_GLITTER_MAIL": { + "label": "Glitter Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + "ITEM_MECH_MAIL": { + "label": "Mech Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + "ITEM_WOOD_MAIL": { + "label": "Wood Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + "ITEM_WAVE_MAIL": { + "label": "Wave Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + "ITEM_BEAD_MAIL": { + "label": "Bead Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + "ITEM_SHADOW_MAIL": { + "label": "Shadow Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + "ITEM_TROPIC_MAIL": { + "label": "Tropic Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + "ITEM_DREAM_MAIL": { + "label": "Dream Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + "ITEM_FAB_MAIL": { + "label": "Fab Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + "ITEM_RETRO_MAIL": { + "label": "Retro Mail", + "classification": "FILLER", + "tags": ["Mail"] + }, + + + "ITEM_CHERI_BERRY": { + "label": "Cheri Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_CHESTO_BERRY": { + "label": "Chesto Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_PECHA_BERRY": { + "label": "Pecha Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_RAWST_BERRY": { + "label": "Rawst Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_ASPEAR_BERRY": { + "label": "Aspear Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_LEPPA_BERRY": { + "label": "Leppa Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_ORAN_BERRY": { + "label": "Oran Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_PERSIM_BERRY": { + "label": "Persim Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_LUM_BERRY": { + "label": "Lum Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_SITRUS_BERRY": { + "label": "Sitrus Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_FIGY_BERRY": { + "label": "Figy Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_WIKI_BERRY": { + "label": "Wiki Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_MAGO_BERRY": { + "label": "Mago Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_AGUAV_BERRY": { + "label": "Aguav Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_IAPAPA_BERRY": { + "label": "Iapapa Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_RAZZ_BERRY": { + "label": "Razz Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_BLUK_BERRY": { + "label": "Bluk Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_NANAB_BERRY": { + "label": "Nanab Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_WEPEAR_BERRY": { + "label": "Wepear Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_PINAP_BERRY": { + "label": "Pinap Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_POMEG_BERRY": { + "label": "Pomeg Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_KELPSY_BERRY": { + "label": "Kelpsy Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_QUALOT_BERRY": { + "label": "Qualot Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_HONDEW_BERRY": { + "label": "Hondew Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_GREPA_BERRY": { + "label": "Grepa Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_TAMATO_BERRY": { + "label": "Tamato Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_CORNN_BERRY": { + "label": "Cornn Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_MAGOST_BERRY": { + "label": "Magost Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_RABUTA_BERRY": { + "label": "Rabuta Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_NOMEL_BERRY": { + "label": "Nomel Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_SPELON_BERRY": { + "label": "Spelon Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_PAMTRE_BERRY": { + "label": "Pamtre Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_WATMEL_BERRY": { + "label": "Watmel Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_DURIN_BERRY": { + "label": "Durin Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_BELUE_BERRY": { + "label": "Belue Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_LIECHI_BERRY": { + "label": "Liechi Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_GANLON_BERRY": { + "label": "Ganlon Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_SALAC_BERRY": { + "label": "Salac Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_PETAYA_BERRY": { + "label": "Petaya Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_APICOT_BERRY": { + "label": "Apicot Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_LANSAT_BERRY": { + "label": "Lansat Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + "ITEM_STARF_BERRY": { + "label": "Starf Berry", + "classification": "FILLER", + "tags": ["Berry"] + }, + + + "ITEM_BRIGHT_POWDER": { + "label": "Bright Powder", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_WHITE_HERB": { + "label": "White Herb", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_MACHO_BRACE": { + "label": "Macho Brace", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_EXP_SHARE": { + "label": "Exp. Share", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_QUICK_CLAW": { + "label": "Quick Claw", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_SOOTHE_BELL": { + "label": "Soothe Bell", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_MENTAL_HERB": { + "label": "Mental Herb", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_CHOICE_BAND": { + "label": "Choice Band", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_KINGS_ROCK": { + "label": "King's Rock", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_SILVER_POWDER": { + "label": "Silver Powder", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_AMULET_COIN": { + "label": "Amulet Coin", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_CLEANSE_TAG": { + "label": "Cleanse Tag", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_SOUL_DEW": { + "label": "Soul Dew", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_DEEP_SEA_TOOTH": { + "label": "Deep Sea Tooth", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_DEEP_SEA_SCALE": { + "label": "Deep Sea Scale", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_SMOKE_BALL": { + "label": "Smoke Ball", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_EVERSTONE": { + "label": "Everstone", + "classification": "FILLER", + "tags": ["Held"] + }, + "ITEM_FOCUS_BAND": { + "label": "Focus Band", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_LUCKY_EGG": { + "label": "Lucky Egg", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_SCOPE_LENS": { + "label": "Scope Lens", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_METAL_COAT": { + "label": "Metal Coat", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_LEFTOVERS": { + "label": "Leftovers", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_DRAGON_SCALE": { + "label": "Dragon Scale", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_LIGHT_BALL": { + "label": "Light Ball", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_SOFT_SAND": { + "label": "Soft Sand", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_HARD_STONE": { + "label": "Hard Stone", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_MIRACLE_SEED": { + "label": "Miracle Seed", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_BLACK_GLASSES": { + "label": "Black Glasses", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_BLACK_BELT": { + "label": "Black Belt", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_MAGNET": { + "label": "Magnet", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_MYSTIC_WATER": { + "label": "Mystic Water", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_SHARP_BEAK": { + "label": "Sharp Beak", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_POISON_BARB": { + "label": "Poison Barb", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_NEVER_MELT_ICE": { + "label": "Never-Melt Ice", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_SPELL_TAG": { + "label": "Spell Tag", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_TWISTED_SPOON": { + "label": "Twisted Spoon", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_CHARCOAL": { + "label": "Charcoal", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_DRAGON_FANG": { + "label": "Dragon Fang", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_SILK_SCARF": { + "label": "Silk Scarf", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_UP_GRADE": { + "label": "Up-Grade", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_SHELL_BELL": { + "label": "Shell Bell", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_SEA_INCENSE": { + "label": "Sea Incense", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_LAX_INCENSE": { + "label": "Lax Incense", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_LUCKY_PUNCH": { + "label": "Lucky Punch", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_METAL_POWDER": { + "label": "Metal Powder", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_THICK_CLUB": { + "label": "Thick Club", + "classification": "USEFUL", + "tags": ["Held"] + }, + "ITEM_STICK": { + "label": "Stick", + "classification": "FILLER", + "tags": ["Held"] + }, + "ITEM_RED_SCARF": { + "label": "Red Scarf", + "classification": "FILLER", + "tags": ["Held"] + }, + "ITEM_BLUE_SCARF": { + "label": "Blue Scarf", + "classification": "FILLER", + "tags": ["Held"] + }, + "ITEM_PINK_SCARF": { + "label": "Pink Scarf", + "classification": "FILLER", + "tags": ["Held"] + }, + "ITEM_GREEN_SCARF": { + "label": "Green Scarf", + "classification": "FILLER", + "tags": ["Held"] + }, + "ITEM_YELLOW_SCARF": { + "label": "Yellow Scarf", + "classification": "FILLER", + "tags": ["Held"] + }, + + + "ITEM_TM01_FOCUS_PUNCH": { + "label": "TM01", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM02_DRAGON_CLAW": { + "label": "TM02", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM03_WATER_PULSE": { + "label": "TM03", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM04_CALM_MIND": { + "label": "TM04", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM05_ROAR": { + "label": "TM05", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM06_TOXIC": { + "label": "TM06", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM07_HAIL": { + "label": "TM07", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM08_BULK_UP": { + "label": "TM08", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM09_BULLET_SEED": { + "label": "TM09", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM10_HIDDEN_POWER": { + "label": "TM10", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM11_SUNNY_DAY": { + "label": "TM11", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM12_TAUNT": { + "label": "TM12", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM13_ICE_BEAM": { + "label": "TM13", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM14_BLIZZARD": { + "label": "TM14", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM15_HYPER_BEAM": { + "label": "TM15", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM16_LIGHT_SCREEN": { + "label": "TM16", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM17_PROTECT": { + "label": "TM17", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM18_RAIN_DANCE": { + "label": "TM18", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM19_GIGA_DRAIN": { + "label": "TM19", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM20_SAFEGUARD": { + "label": "TM20", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM21_FRUSTRATION": { + "label": "TM21", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM22_SOLAR_BEAM": { + "label": "TM22", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM23_IRON_TAIL": { + "label": "TM23", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM24_THUNDERBOLT": { + "label": "TM24", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM25_THUNDER": { + "label": "TM25", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM26_EARTHQUAKE": { + "label": "TM26", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM27_RETURN": { + "label": "TM27", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM28_DIG": { + "label": "TM28", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM29_PSYCHIC": { + "label": "TM29", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM30_SHADOW_BALL": { + "label": "TM30", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM31_BRICK_BREAK": { + "label": "TM31", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM32_DOUBLE_TEAM": { + "label": "TM32", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM33_REFLECT": { + "label": "TM33", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM34_SHOCK_WAVE": { + "label": "TM34", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM35_FLAMETHROWER": { + "label": "TM35", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM36_SLUDGE_BOMB": { + "label": "TM36", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM37_SANDSTORM": { + "label": "TM37", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM38_FIRE_BLAST": { + "label": "TM38", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM39_ROCK_TOMB": { + "label": "TM39", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM40_AERIAL_ACE": { + "label": "TM40", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM41_TORMENT": { + "label": "TM41", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM42_FACADE": { + "label": "TM42", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM43_SECRET_POWER": { + "label": "TM43", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM44_REST": { + "label": "TM44", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM45_ATTRACT": { + "label": "TM45", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM46_THIEF": { + "label": "TM46", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM47_STEEL_WING": { + "label": "TM47", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM48_SKILL_SWAP": { + "label": "TM48", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM49_SNATCH": { + "label": "TM49", + "classification": "USEFUL", + "tags": ["TM"] + }, + "ITEM_TM50_OVERHEAT": { + "label": "TM50", + "classification": "USEFUL", + "tags": ["TM"] + } +} diff --git a/worlds/pokemon_emerald/data/locations.json b/worlds/pokemon_emerald/data/locations.json new file mode 100644 index 000000000000..a44ec204a02c --- /dev/null +++ b/worlds/pokemon_emerald/data/locations.json @@ -0,0 +1,1441 @@ +{ + "BADGE_1": { + "label": "Rustboro Gym - Stone Badge", + "tags": ["Badge"] + }, + "BADGE_2": { + "label": "Dewford Gym - Knuckle Badge", + "tags": ["Badge"] + }, + "BADGE_3": { + "label": "Mauville Gym - Dynamo Badge", + "tags": ["Badge"] + }, + "BADGE_4": { + "label": "Lavaridge Gym - Heat Badge", + "tags": ["Badge"] + }, + "BADGE_5": { + "label": "Petalburg Gym - Balance Badge", + "tags": ["Badge"] + }, + "BADGE_6": { + "label": "Fortree Gym - Feather Badge", + "tags": ["Badge"] + }, + "BADGE_7": { + "label": "Mossdeep Gym - Mind Badge", + "tags": ["Badge"] + }, + "BADGE_8": { + "label": "Sootopolis Gym - Rain Badge", + "tags": ["Badge"] + }, + + "NPC_GIFT_RECEIVED_HM01": { + "label": "Rustboro City - HM01 from Cutter's House", + "tags": ["HM"] + }, + "NPC_GIFT_RECEIVED_HM02": { + "label": "Route 119 - HM02 from Rival Battle", + "tags": ["HM"] + }, + "NPC_GIFT_RECEIVED_HM03": { + "label": "Petalburg City - HM03 from Wally's Uncle", + "tags": ["HM"] + }, + "NPC_GIFT_RECEIVED_HM04": { + "label": "Rusturf Tunnel - HM04 from Tunneler", + "tags": ["HM"] + }, + "NPC_GIFT_RECEIVED_HM05": { + "label": "Granite Cave 1F - HM05 from Hiker", + "tags": ["HM"] + }, + "NPC_GIFT_RECEIVED_HM06": { + "label": "Mauville City - HM06 from Rock Smash Guy", + "tags": ["HM"] + }, + "NPC_GIFT_RECEIVED_HM07": { + "label": "Sootopolis City - HM07 from Wallace", + "tags": ["HM"] + }, + "NPC_GIFT_RECEIVED_HM08": { + "label": "Mossdeep City - HM08 from Steven's House", + "tags": ["HM"] + }, + + "NPC_GIFT_RECEIVED_ACRO_BIKE": { + "label": "Mauville City - Acro Bike", + "tags": ["Bike"] + }, + "NPC_GIFT_RECEIVED_MACH_BIKE": { + "label": "Mauville City - Mach Bike", + "tags": ["Bike"] + }, + + "NPC_GIFT_RECEIVED_WAILMER_PAIL": { + "label": "Route 104 - Wailmer Pail from Flower Shop Lady", + "tags": ["KeyItem"] + }, + "NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL": { + "label": "Rusturf Tunnel - Recover Devon Goods", + "tags": ["KeyItem"] + }, + "NPC_GIFT_RECEIVED_LETTER": { + "label": "Devon Corp 3F - Letter from Mr. Stone", + "tags": ["KeyItem"] + }, + "NPC_GIFT_RECEIVED_COIN_CASE": { + "label": "Mauville City - Coin Case from Lady in House", + "tags": ["KeyItem"] + }, + "NPC_GIFT_RECEIVED_METEORITE": { + "label": "Mt Chimney - Meteorite from Machine", + "tags": ["KeyItem"] + }, + "NPC_GIFT_RECEIVED_GO_GOGGLES": { + "label": "Lavaridge Town - Go Goggles from Rival", + "tags": ["KeyItem"] + }, + "NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON": { + "label": "Mauville City - Basement Key from Wattson", + "tags": ["KeyItem"] + }, + "NPC_GIFT_RECEIVED_ITEMFINDER": { + "label": "Route 110 - Itemfinder from Rival", + "tags": ["KeyItem"] + }, + "NPC_GIFT_RECEIVED_DEVON_SCOPE": { + "label": "Route 120 - Devon Scope from Steven", + "tags": ["KeyItem"] + }, + "NPC_GIFT_RECEIVED_MAGMA_EMBLEM": { + "label": "Mt Pyre Summit - Magma Emblem from Old Lady", + "tags": ["KeyItem"] + }, + "ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY": { + "label": "Abandoned Ship - Captain's Office Key", + "tags": ["KeyItem"] + }, + "HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY": { + "label": "Abandoned Ship HF - Hidden Item in Room 1", + "tags": ["KeyItem"] + }, + "HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY": { + "label": "Abandoned Ship HF - Hidden Item in Room 3", + "tags": ["KeyItem"] + }, + "HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY": { + "label": "Abandoned Ship HF - Hidden Item in Room 4", + "tags": ["KeyItem"] + }, + "HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY": { + "label": "Abandoned Ship HF - Hidden Item in Room 5", + "tags": ["KeyItem"] + }, + "ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_4_SCANNER": { + "label": "Abandoned Ship HF - Item in Room 2", + "tags": ["KeyItem"] + }, + "NPC_GIFT_RECEIVED_POKEBLOCK_CASE": { + "label": "Lilycove City - Pokeblock Case from Contest Hall", + "tags": ["KeyItem"] + }, + "NPC_GIFT_RECEIVED_SS_TICKET": { + "label": "Littleroot Town - S.S. Ticket from Norman", + "tags": ["Ferry"] + }, + + "NPC_GIFT_RECEIVED_OLD_ROD": { + "label": "Dewford Town - Old Rod from Fisherman", + "tags": ["Rod"] + }, + "NPC_GIFT_RECEIVED_GOOD_ROD": { + "label": "Route 118 - Good Rod from Fisherman", + "tags": ["Rod"] + }, + "NPC_GIFT_RECEIVED_SUPER_ROD": { + "label": "Mossdeep City - Super Rod from Fisherman in House", + "tags": ["Rod"] + }, + + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM": { + "label": "Artisan Cave B1F - Hidden Item 1", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON": { + "label": "Artisan Cave B1F - Hidden Item 2", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN": { + "label": "Artisan Cave B1F - Hidden Item 3", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC": { + "label": "Artisan Cave B1F - Hidden Item 4", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET": { + "label": "Fallarbor Town - Hidden Item in Crater", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1": { + "label": "Granite Cave B2F - Hidden Item After Crumbling Floor", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2": { + "label": "Granite Cave B2F - Hidden Item on Platform", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL": { + "label": "Jagged Pass - Hidden Item in Grass", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL": { + "label": "Jagged Pass - Hidden Item in Corner", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL": { + "label": "Lavaridge Town - Hidden Item in Springs", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE": { + "label": "Lilycove City - Hidden Item on Beach West", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL": { + "label": "Lilycove City - Hidden Item on Beach East", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_LILYCOVE_CITY_PP_UP": { + "label": "Lilycove City - Hidden Item on Beach North", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER": { + "label": "Mt Pyre Exterior - Hidden Item First Grave", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL": { + "label": "Mt Pyre Exterior - Hidden Item Second Grave", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY": { + "label": "Mt Pyre Summit - Hidden Item in Grass", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC": { + "label": "Mt Pyre Summit - Hidden Item Grave", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH": { + "label": "Navel Rock Top - Hidden Item Sacred Ash", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY": { + "label": "Petalburg City - Hidden Item Past Pond South", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL": { + "label": "Petalburg Woods - Hidden Item After Grunt", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_PETALBURG_WOODS_POTION": { + "label": "Petalburg Woods - Hidden Item Southeast", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1": { + "label": "Petalburg Woods - Hidden Item Past Tree North", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2": { + "label": "Petalburg Woods - Hidden Item Past Tree South", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_104_ANTIDOTE": { + "label": "Route 104 - Hidden Item on Beach 1", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_104_HEART_SCALE": { + "label": "Route 104 - Hidden Item on Beach 2", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_104_POTION": { + "label": "Route 104 - Hidden Item on Beach 3", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_104_POKE_BALL": { + "label": "Route 104 - Hidden Item Behind Flower Shop 1", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_104_SUPER_POTION": { + "label": "Route 104 - Hidden Item Behind Flower Shop 2", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_105_BIG_PEARL": { + "label": "Route 105 - Hidden Item Between Trainers", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_105_HEART_SCALE": { + "label": "Route 105 - Hidden Item on Small Island", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_106_HEART_SCALE": { + "label": "Route 106 - Hidden Item on Beach 1", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_106_STARDUST": { + "label": "Route 106 - Hidden Item on Beach 2", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_106_POKE_BALL": { + "label": "Route 106 - Hidden Item on Beach 3", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_108_RARE_CANDY": { + "label": "Route 108 - Hidden Item on Rock", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_109_REVIVE": { + "label": "Route 109 - Hidden Item on Beach Southwest", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_109_ETHER": { + "label": "Route 109 - Hidden Item on Beach Southeast", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2": { + "label": "Route 109 - Hidden Item on Beach Under Umbrella", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_109_GREAT_BALL": { + "label": "Route 109 - Hidden Item on Beach West", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1": { + "label": "Route 109 - Hidden Item on Beach Behind Old Man", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3": { + "label": "Route 109 - Hidden Item in Front of Couple", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_110_FULL_HEAL": { + "label": "Route 110 - Hidden Item South of Rival", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_110_GREAT_BALL": { + "label": "Route 110 - Hidden Item North of Rival", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_110_REVIVE": { + "label": "Route 110 - Hidden Item Behind Two Trainers", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_110_POKE_BALL": { + "label": "Route 110 - Hidden Item South of Berries", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_111_PROTEIN": { + "label": "Route 111 - Hidden Item Desert Behind Tower", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_111_RARE_CANDY": { + "label": "Route 111 - Hidden Item Desert on Rock 1", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_111_STARDUST": { + "label": "Route 111 - Hidden Item Desert on Rock 2", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_113_ETHER": { + "label": "Route 113 - Hidden Item Mound West of Three Trainers", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_113_NUGGET": { + "label": "Route 113 - Hidden Item Mound Between Trainers", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_113_TM32": { + "label": "Route 113 - Hidden Item Mound West of Workshop", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_114_CARBOS": { + "label": "Route 114 - Hidden Item Rock in Grass", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_114_REVIVE": { + "label": "Route 114 - Hidden Item West of Bridge", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_115_HEART_SCALE": { + "label": "Route 115 - Hidden Item Behind Trainer on Beach", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES": { + "label": "Route 116 - Hidden Item in East", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_116_SUPER_POTION": { + "label": "Route 116 - Hidden Item in Tree Maze", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_117_REPEL": { + "label": "Route 117 - Hidden Item Behind Flower Patch", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_118_HEART_SCALE": { + "label": "Route 118 - Hidden Item West on Rock", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_118_IRON": { + "label": "Route 118 - Hidden Item East on Rock", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_119_FULL_HEAL": { + "label": "Route 119 - Hidden Item in South Tall Grass", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_119_CALCIUM": { + "label": "Route 119 - Hidden Item Across South Rail", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_119_ULTRA_BALL": { + "label": "Route 119 - Hidden Item in East Tall Grass", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_119_MAX_ETHER": { + "label": "Route 119 - Hidden Item Next to Waterfall", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1": { + "label": "Route 120 - Hidden Item Behind Trees", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_120_REVIVE": { + "label": "Route 120 - Hidden Item in North Tall Grass", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_120_ZINC": { + "label": "Route 120 - Hidden Item in Tall Grass Maze", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2": { + "label": "Route 120 - Hidden Item Behind Southwest Pool", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_121_HP_UP": { + "label": "Route 121 - Hidden Item West of Grunts", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_121_FULL_HEAL": { + "label": "Route 121 - Hidden Item in Maze 1", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_121_MAX_REVIVE": { + "label": "Route 121 - Hidden Item in Maze 2", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_121_NUGGET": { + "label": "Route 121 - Hidden Item Behind Tree", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_123_PP_UP": { + "label": "Route 123 - Hidden Item East Behind Tree 1", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_123_RARE_CANDY": { + "label": "Route 123 - Hidden Item East Behind Tree 2", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_123_HYPER_POTION": { + "label": "Route 123 - Hidden Item on Rock Before Ledges", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_123_SUPER_REPEL": { + "label": "Route 123 - Hidden Item in North Path Grass", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_123_REVIVE": { + "label": "Route 123 - Hidden Item Behind House", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1": { + "label": "Route 128 - Hidden Item North Island", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2": { + "label": "Route 128 - Hidden Item Center Island", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3": { + "label": "Route 128 - Hidden Item Southwest Island", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC": { + "label": "Safari Zone NE - Hidden Item North", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY": { + "label": "Safari Zone NE - Hidden Item East", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE": { + "label": "Safari Zone SE - Hidden Item in South Grass 1", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP": { + "label": "Safari Zone SE - Hidden Item in South Grass 2", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS": { + "label": "SS Tidal - Hidden Item in Lower Deck Trash Can", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_TRICK_HOUSE_NUGGET": { + "label": "Trick House - Hidden Item", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD": { + "label": "Route 124 UW - Hidden Item in Big Area", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_124_CARBOS": { + "label": "Route 124 UW - Hidden Item in Tunnel Alcove", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_124_CALCIUM": { + "label": "Route 124 UW - Hidden Item in North Tunnel 1", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2": { + "label": "Route 124 UW - Hidden Item in North Tunnel 2", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_124_PEARL": { + "label": "Route 124 UW - Hidden Item in Small Area North", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL": { + "label": "Route 124 UW - Hidden Item in Small Area Middle", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1": { + "label": "Route 124 UW - Hidden Item in Small Area South", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_126_STARDUST": { + "label": "Route 126 UW - Hidden Item Northeast", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL": { + "label": "Route 126 UW - Hidden Item in North Alcove", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL": { + "label": "Route 126 UW - Hidden Item in Southeast", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE": { + "label": "Route 126 UW - Hidden Item in Northwest Alcove", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD": { + "label": "Route 126 UW - Hidden Item in Southwest Area", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_126_IRON": { + "label": "Route 126 UW - Hidden Item in West Area 1", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_126_PEARL": { + "label": "Route 126 UW - Hidden Item in West Area 2", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD": { + "label": "Route 126 UW - Hidden Item in West Area 3", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE": { + "label": "Route 127 UW - Hidden Item in West Area", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE": { + "label": "Route 127 UW - Hidden Item in Center Area", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_127_HP_UP": { + "label": "Route 127 UW - Hidden Item in East Area", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_127_RED_SHARD": { + "label": "Route 127 UW - Hidden Item in Northeast Area", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_128_PEARL": { + "label": "Route 128 UW - Hidden Item in East Area", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_UNDERWATER_128_PROTEIN": { + "label": "Route 128 UW - Hidden Item in Small Area", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL": { + "label": "Victory Road 1F - Hidden Item on Southeast Ledge", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR": { + "label": "Victory Road B2F - Hidden Item Above Waterfall", + "tags": ["HiddenItem"] + }, + "HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL": { + "label": "Victory Road B2F - Hidden Item in Northeast Corner", + "tags": ["HiddenItem"] + }, + + "ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM18": { + "label": "Abandoned Ship HF - Item in Room 1", + "tags": ["OverworldItem"] + }, + "ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE": { + "label": "Abandoned Ship HF - Item in Room 3", + "tags": ["OverworldItem"] + }, + "ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL": { + "label": "Abandoned Ship HF - Item in Room 6", + "tags": ["OverworldItem"] + }, + "ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL": { + "label": "Abandoned Ship 1F - Item in East Side Northwest Room", + "tags": ["OverworldItem"] + }, + "ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE": { + "label": "Abandoned Ship 1F - Item in West Side North Room", + "tags": ["OverworldItem"] + }, + "ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE": { + "label": "Abandoned Ship B1F - Item in South Rooms", + "tags": ["OverworldItem"] + }, + "ITEM_ABANDONED_SHIP_ROOMS_B1F_TM13": { + "label": "Abandoned Ship B1F - Item in Storage Room", + "tags": ["OverworldItem"] + }, + "ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL": { + "label": "Abandoned Ship B1F - Item in North Rooms", + "tags": ["OverworldItem"] + }, + "ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL": { + "label": "Aqua Hideout B1F - Item in Center Room 1", + "tags": ["OverworldItem"] + }, + "ITEM_AQUA_HIDEOUT_B1F_NUGGET": { + "label": "Aqua Hideout B1F - Item in Center Room 2", + "tags": ["OverworldItem"] + }, + "ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR": { + "label": "Aqua Hideout B1F - Item in East Room", + "tags": ["OverworldItem"] + }, + "ITEM_AQUA_HIDEOUT_B2F_NEST_BALL": { + "label": "Aqua Hideout B2F - Item in Long Hallway", + "tags": ["OverworldItem"] + }, + "ITEM_ARTISAN_CAVE_1F_CARBOS": { + "label": "Artisan Cave 1F - Item", + "tags": ["OverworldItem"] + }, + "ITEM_ARTISAN_CAVE_B1F_HP_UP": { + "label": "Artisan Cave B1F - Item", + "tags": ["OverworldItem"] + }, + "ITEM_FIERY_PATH_FIRE_STONE": { + "label": "Fiery Path - Item Behind Boulders 1", + "tags": ["OverworldItem"] + }, + "ITEM_FIERY_PATH_TM06": { + "label": "Fiery Path - Item Behind Boulders 2", + "tags": ["OverworldItem"] + }, + "ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE": { + "label": "Granite Cave 1F - Item Before Ladder", + "tags": ["OverworldItem"] + }, + "ITEM_GRANITE_CAVE_B1F_POKE_BALL": { + "label": "Granite Cave B1F - Item in Alcove", + "tags": ["OverworldItem"] + }, + "ITEM_GRANITE_CAVE_B2F_RARE_CANDY": { + "label": "Granite Cave B2F - Item After Crumbling Floor", + "tags": ["OverworldItem"] + }, + "ITEM_GRANITE_CAVE_B2F_REPEL": { + "label": "Granite Cave B2F - Item After Mud Slope", + "tags": ["OverworldItem"] + }, + "ITEM_JAGGED_PASS_BURN_HEAL": { + "label": "Jagged Pass - Item Below Hideout", + "tags": ["OverworldItem"] + }, + "ITEM_LILYCOVE_CITY_MAX_REPEL": { + "label": "Lilycove City - Item on Peninsula", + "tags": ["OverworldItem"] + }, + "ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY": { + "label": "Magma Hideout 1F - Item on Ledge", + "tags": ["OverworldItem"] + }, + "ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE": { + "label": "Magma Hideout 2F - Item on West Platform", + "tags": ["OverworldItem"] + }, + "ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR": { + "label": "Magma Hideout 2F - Item on East Platform", + "tags": ["OverworldItem"] + }, + "ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET": { + "label": "Magma Hideout 3F - Item Before Last Floor", + "tags": ["OverworldItem"] + }, + "ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX": { + "label": "Magma Hideout 3F - Item in Drill Room", + "tags": ["OverworldItem"] + }, + "ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE": { + "label": "Magma Hideout 3F - Item After Groudon", + "tags": ["OverworldItem"] + }, + "ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE": { + "label": "Magma Hideout 4F - Item Before Groudon", + "tags": ["OverworldItem"] + }, + "ITEM_MAUVILLE_CITY_X_SPEED": { + "label": "Mauville City - Item", + "tags": ["OverworldItem"] + }, + "ITEM_METEOR_FALLS_1F_1R_FULL_HEAL": { + "label": "Meteor Falls 1F - Item Northeast", + "tags": ["OverworldItem"] + }, + "ITEM_METEOR_FALLS_1F_1R_MOON_STONE": { + "label": "Meteor Falls 1F - Item West", + "tags": ["OverworldItem"] + }, + "ITEM_METEOR_FALLS_1F_1R_PP_UP": { + "label": "Meteor Falls 1F - Item Below Waterfall", + "tags": ["OverworldItem"] + }, + "ITEM_METEOR_FALLS_1F_1R_TM23": { + "label": "Meteor Falls 1F - Item Before Steven's Cave", + "tags": ["OverworldItem"] + }, + "ITEM_METEOR_FALLS_B1F_2R_TM02": { + "label": "Meteor Falls B1F - Item in North Cave", + "tags": ["OverworldItem"] + }, + "ITEM_MOSSDEEP_CITY_NET_BALL": { + "label": "Mossdeep City - Item", + "tags": ["OverworldItem"] + }, + "ITEM_MT_PYRE_2F_ULTRA_BALL": { + "label": "Mt Pyre 2F - Item", + "tags": ["OverworldItem"] + }, + "ITEM_MT_PYRE_3F_SUPER_REPEL": { + "label": "Mt Pyre 3F - Item", + "tags": ["OverworldItem"] + }, + "ITEM_MT_PYRE_4F_SEA_INCENSE": { + "label": "Mt Pyre 4F - Item", + "tags": ["OverworldItem"] + }, + "ITEM_MT_PYRE_5F_LAX_INCENSE": { + "label": "Mt Pyre 5F - Item", + "tags": ["OverworldItem"] + }, + "ITEM_MT_PYRE_6F_TM30": { + "label": "Mt Pyre 6F - Item", + "tags": ["OverworldItem"] + }, + "ITEM_MT_PYRE_EXTERIOR_TM48": { + "label": "Mt Pyre Exterior - Item 1", + "tags": ["OverworldItem"] + }, + "ITEM_MT_PYRE_EXTERIOR_MAX_POTION": { + "label": "Mt Pyre Exterior - Item 2", + "tags": ["OverworldItem"] + }, + "ITEM_NEW_MAUVILLE_ESCAPE_ROPE": { + "label": "New Mauville - Item 1", + "tags": ["OverworldItem"] + }, + "ITEM_NEW_MAUVILLE_PARALYZE_HEAL": { + "label": "New Mauville - Item 2", + "tags": ["OverworldItem"] + }, + "ITEM_NEW_MAUVILLE_FULL_HEAL": { + "label": "New Mauville - Item 3", + "tags": ["OverworldItem"] + }, + "ITEM_NEW_MAUVILLE_THUNDER_STONE": { + "label": "New Mauville - Item 4", + "tags": ["OverworldItem"] + }, + "ITEM_NEW_MAUVILLE_ULTRA_BALL": { + "label": "New Mauville - Item 5", + "tags": ["OverworldItem"] + }, + "ITEM_PETALBURG_CITY_ETHER": { + "label": "Petalburg City - Item Past Pond South", + "tags": ["OverworldItem"] + }, + "ITEM_PETALBURG_CITY_MAX_REVIVE": { + "label": "Petalburg City - Item Past Pond North", + "tags": ["OverworldItem"] + }, + "ITEM_PETALBURG_WOODS_ETHER": { + "label": "Petalburg Woods - Item Northwest", + "tags": ["OverworldItem"] + }, + "ITEM_PETALBURG_WOODS_PARALYZE_HEAL": { + "label": "Petalburg Woods - Item Southwest", + "tags": ["OverworldItem"] + }, + "ITEM_PETALBURG_WOODS_GREAT_BALL": { + "label": "Petalburg Woods - Item Past Tree Northeast", + "tags": ["OverworldItem"] + }, + "ITEM_PETALBURG_WOODS_X_ATTACK": { + "label": "Petalburg Woods - Item Past Tree South", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_102_POTION": { + "label": "Route 102 - Item", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_103_GUARD_SPEC": { + "label": "Route 103 - Item Near Berries", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_103_PP_UP": { + "label": "Route 103 - Item in Tree Maze", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_104_POKE_BALL": { + "label": "Route 104 - Item Near Briney on Ledge", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_104_POTION": { + "label": "Route 104 - Item Behind Flower Shop", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_104_X_ACCURACY": { + "label": "Route 104 - Item Behind Tree", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_104_PP_UP": { + "label": "Route 104 - Item East Past Pond", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_105_IRON": { + "label": "Route 105 - Item on Island", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_106_PROTEIN": { + "label": "Route 106 - Item on West Beach", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_108_STAR_PIECE": { + "label": "Route 108 - Item Between Trainers", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_109_POTION": { + "label": "Route 109 - Item on Beach", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_109_PP_UP": { + "label": "Route 109 - Item on Island", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_110_DIRE_HIT": { + "label": "Route 110 - Item South of Rival", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_110_ELIXIR": { + "label": "Route 110 - Item South of Berries", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_110_RARE_CANDY": { + "label": "Route 110 - Item on Island", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_111_ELIXIR": { + "label": "Route 111 - Item Near Winstrates", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_111_HP_UP": { + "label": "Route 111 - Item West of Pond Near Winstrates", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_111_STARDUST": { + "label": "Route 111 - Item Desert Near Tower", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_111_TM37": { + "label": "Route 111 - Item Desert South", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_112_NUGGET": { + "label": "Route 112 - Item on Ledges", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_113_SUPER_REPEL": { + "label": "Route 113 - Item Past Three Trainers", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_113_MAX_ETHER": { + "label": "Route 113 - Item on Ledge", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_113_HYPER_POTION": { + "label": "Route 113 - Item Near Fallarbor South", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_114_ENERGY_POWDER": { + "label": "Route 114 - Item Between Trainers", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_114_PROTEIN": { + "label": "Route 114 - Item Behind Smashable Rock", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_114_RARE_CANDY": { + "label": "Route 114 - Item Above Waterfall", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_115_SUPER_POTION": { + "label": "Route 115 - Item on Beach", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_115_PP_UP": { + "label": "Route 115 - Item on Ledge", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_115_GREAT_BALL": { + "label": "Route 115 - Item Behind Smashable Rock", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_115_HEAL_POWDER": { + "label": "Route 115 - Item North Near Trainers", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_115_TM01": { + "label": "Route 115 - Item Near Mud Slope", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_115_IRON": { + "label": "Route 115 - Item Past Mud Slope", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_116_REPEL": { + "label": "Route 116 - Item in Grass", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_116_X_SPECIAL": { + "label": "Route 116 - Item Near Tunnel", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_116_POTION": { + "label": "Route 116 - Item in Tree Maze 1", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_116_ETHER": { + "label": "Route 116 - Item in Tree Maze 2", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_116_HP_UP": { + "label": "Route 116 - Item in East", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_117_GREAT_BALL": { + "label": "Route 117 - Item Behind Flower Patch", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_117_REVIVE": { + "label": "Route 117 - Item Behind Tree", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_118_HYPER_POTION": { + "label": "Route 118 - Item", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_119_SUPER_REPEL": { + "label": "Route 119 - Item in South Tall Grass 1", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_119_HYPER_POTION_1": { + "label": "Route 119 - Item in South Tall Grass 2", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_119_ZINC": { + "label": "Route 119 - Item Across River South", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_119_HYPER_POTION_2": { + "label": "Route 119 - Item Near Mud Slope", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_119_ELIXIR_1": { + "label": "Route 119 - Item East of Mud Slope", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_119_ELIXIR_2": { + "label": "Route 119 - Item on River Bank", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_119_LEAF_STONE": { + "label": "Route 119 - Item Near South Waterfall", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_119_NUGGET": { + "label": "Route 119 - Item Above North Waterfall 1", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_119_RARE_CANDY": { + "label": "Route 119 - Item Above North Waterfall 2", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_120_NEST_BALL": { + "label": "Route 120 - Item Near North Pond", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_120_REVIVE": { + "label": "Route 120 - Item in North Puddles", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_120_NUGGET": { + "label": "Route 120 - Item in Tall Grass Maze", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_120_HYPER_POTION": { + "label": "Route 120 - Item in Tall Grass South", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_120_FULL_HEAL": { + "label": "Route 120 - Item Behind Southwest Pool", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_121_ZINC": { + "label": "Route 121 - Item Near Safari Zone", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_121_REVIVE": { + "label": "Route 121 - Item in Maze 1", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_121_CARBOS": { + "label": "Route 121 - Item in Maze 2", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_123_ULTRA_BALL": { + "label": "Route 123 - Item Below Ledges", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_123_ELIXIR": { + "label": "Route 123 - Item on Ledges 1", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_123_REVIVAL_HERB": { + "label": "Route 123 - Item on Ledges 2", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_123_PP_UP": { + "label": "Route 123 - Item on Ledges 3", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_123_CALCIUM": { + "label": "Route 123 - Item on Ledges 4", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_124_RED_SHARD": { + "label": "Route 124 - Item in Northwest Area", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_124_YELLOW_SHARD": { + "label": "Route 124 - Item in Northeast Area", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_124_BLUE_SHARD": { + "label": "Route 124 - Item in Southwest Area", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_125_BIG_PEARL": { + "label": "Route 125 - Item Between Trainers", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_126_GREEN_SHARD": { + "label": "Route 126 - Item in Separated Area", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_127_ZINC": { + "label": "Route 127 - Item North", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_127_CARBOS": { + "label": "Route 127 - Item East", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_127_RARE_CANDY": { + "label": "Route 127 - Item Between Trainers", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_132_PROTEIN": { + "label": "Route 132 - Item 1", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_132_RARE_CANDY": { + "label": "Route 132 - Item 2", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_133_BIG_PEARL": { + "label": "Route 133 - Item 1", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_133_MAX_REVIVE": { + "label": "Route 133 - Item 2", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_133_STAR_PIECE": { + "label": "Route 133 - Item 3", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_134_CARBOS": { + "label": "Route 134 - Item 1", + "tags": ["OverworldItem"] + }, + "ITEM_ROUTE_134_STAR_PIECE": { + "label": "Route 134 - Item 2", + "tags": ["OverworldItem"] + }, + "ITEM_RUSTBORO_CITY_X_DEFEND": { + "label": "Rustboro City - Item Behind Fences", + "tags": ["OverworldItem"] + }, + "ITEM_RUSTURF_TUNNEL_POKE_BALL": { + "label": "Rusturf Tunnel - Item West", + "tags": ["OverworldItem"] + }, + "ITEM_RUSTURF_TUNNEL_MAX_ETHER": { + "label": "Rusturf Tunnel - Item East", + "tags": ["OverworldItem"] + }, + "ITEM_SAFARI_ZONE_NORTH_CALCIUM": { + "label": "Safari Zone N - Item in Grass", + "tags": ["OverworldItem"] + }, + "ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET": { + "label": "Safari Zone NE - Item on Ledge", + "tags": ["OverworldItem"] + }, + "ITEM_SAFARI_ZONE_NORTH_WEST_TM22": { + "label": "Safari Zone NW - Item Behind Pond", + "tags": ["OverworldItem"] + }, + "ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL": { + "label": "Safari Zone SE - Item in Grass", + "tags": ["OverworldItem"] + }, + "ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE": { + "label": "Safari Zone SW - Item Behind Pond", + "tags": ["OverworldItem"] + }, + "ITEM_SCORCHED_SLAB_TM11": { + "label": "Scorched Slab - Item", + "tags": ["OverworldItem"] + }, + "ITEM_SEAFLOOR_CAVERN_ROOM_9_TM26": { + "label": "Seafloor Cavern Room 9 - Item Before Kyogre", + "tags": ["OverworldItem"] + }, + "ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL": { + "label": "Shoal Cave Entrance - Item on Ledge", + "tags": ["OverworldItem"] + }, + "ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE": { + "label": "Shoal Cave Ice Room - Item 1", + "tags": ["OverworldItem"] + }, + "ITEM_SHOAL_CAVE_ICE_ROOM_TM07": { + "label": "Shoal Cave Ice Room - Item 2", + "tags": ["OverworldItem"] + }, + "ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY": { + "label": "Shoal Cave Inner Room - Item in Center", + "tags": ["OverworldItem"] + }, + "ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL": { + "label": "Shoal Cave Stairs Room - Item", + "tags": ["OverworldItem"] + }, + "ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL": { + "label": "Trick House Puzzle 1 - Item", + "tags": ["OverworldItem"] + }, + "ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL": { + "label": "Trick House Puzzle 2 - Item 1", + "tags": ["OverworldItem"] + }, + "ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL": { + "label": "Trick House Puzzle 2 - Item 2", + "tags": ["OverworldItem"] + }, + "ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL": { + "label": "Trick House Puzzle 3 - Item 1", + "tags": ["OverworldItem"] + }, + "ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL": { + "label": "Trick House Puzzle 3 - Item 2", + "tags": ["OverworldItem"] + }, + "ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL": { + "label": "Trick House Puzzle 4 - Item", + "tags": ["OverworldItem"] + }, + "ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL": { + "label": "Trick House Puzzle 6 - Item", + "tags": ["OverworldItem"] + }, + "ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL": { + "label": "Trick House Puzzle 7 - Item", + "tags": ["OverworldItem"] + }, + "ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL": { + "label": "Trick House Puzzle 8 - Item", + "tags": ["OverworldItem"] + }, + "ITEM_VICTORY_ROAD_1F_MAX_ELIXIR": { + "label": "Victory Road 1F - Item East", + "tags": ["OverworldItem"] + }, + "ITEM_VICTORY_ROAD_1F_PP_UP": { + "label": "Victory Road 1F - Item on Southeast Ledge", + "tags": ["OverworldItem"] + }, + "ITEM_VICTORY_ROAD_B1F_FULL_RESTORE": { + "label": "Victory Road B1F - Item Behind Boulders", + "tags": ["OverworldItem"] + }, + "ITEM_VICTORY_ROAD_B1F_TM29": { + "label": "Victory Road B1F - Item on Northeast Ledge", + "tags": ["OverworldItem"] + }, + "ITEM_VICTORY_ROAD_B2F_FULL_HEAL": { + "label": "Victory Road B2F - Item Above Waterfall", + "tags": ["OverworldItem"] + }, + + "NPC_GIFT_GOT_TM24_FROM_WATTSON": { + "label": "Mauville City - TM24 from Wattson", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_6_SODA_POP": { + "label": "Route 109 - Seashore House Reward", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_AMULET_COIN": { + "label": "Littleroot Town - Amulet Coin from Mom", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_CHARCOAL": { + "label": "Lavaridge Town Herb Shop - Charcoal from Man", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_CHESTO_BERRY_ROUTE_104": { + "label": "Route 104 - Gift from Woman Near Berries", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_CLEANSE_TAG": { + "label": "Mt Pyre 1F - Cleanse Tag from Woman in NE Corner", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_EXP_SHARE": { + "label": "Devon Corp 3F - Exp. Share from Mr. Stone", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_FOCUS_BAND": { + "label": "Shoal Cave Lower Room - Focus Band from Black Belt", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_GREAT_BALL_PETALBURG_WOODS": { + "label": "Petalburg Woods - Gift from Devon Employee", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_GREAT_BALL_RUSTBORO_CITY": { + "label": "Rustboro City - Gift from Devon Employee", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_KINGS_ROCK": { + "label": "Mossdeep City - King's Rock from Kid", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_MACHO_BRACE": { + "label": "Route 111 - Winstrate Family Reward", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_MENTAL_HERB": { + "label": "Fortree City - Wingull Delivery Reward", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_MIRACLE_SEED": { + "label": "Petalburg Woods - Miracle Seed from Lady", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_POTION_OLDALE": { + "label": "Oldale Town - Gift from Shop Tutorial", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_POWDER_JAR": { + "label": "Slateport City - Powder Jar from Lady in Market", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_PREMIER_BALL_RUSTBORO": { + "label": "Rustboro City - Gift from Boy in Apartments", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_QUICK_CLAW": { + "label": "Rustboro City - Quick Claw from School Teacher", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_REPEAT_BALL": { + "label": "Route 116 - Gift from Devon Researcher", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_SECRET_POWER": { + "label": "Route 111 - Secret Power from Man Near Tree", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_SILK_SCARF": { + "label": "Dewford Town - Silk Scarf from Man in House", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_SOFT_SAND": { + "label": "Route 109 - Soft Sand from Tuber", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_SOOTHE_BELL": { + "label": "Slateport City - Soothe Bell from Woman in Fan Club", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_SUN_STONE_MOSSDEEP": { + "label": "Mossdeep City - Gift from Man in Museum", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM03": { + "label": "Sootopolis Gym - TM03 from Juan", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM04": { + "label": "Mossdeep Gym - TM04 from Tate and Liza", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM05": { + "label": "Route 114 - TM05 from Roaring Man", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM08": { + "label": "Dewford Gym - TM08 from Brawly", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM09": { + "label": "Route 104 - TM09 from Boy", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM10": { + "label": "Fortree City - TM10 from Hidden Power Lady", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM19": { + "label": "Route 123 - TM19 from Girl near Berries", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM21": { + "label": "Pacifidlog Town - TM21 from Man in House", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM27": { + "label": "Fallarbor Town - TM27 from Cozmo", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM27_2": { + "label": "Pacifidlog Town - TM27 from Man in House", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM28": { + "label": "Route 114 - TM28 from Fossil Maniac", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM31": { + "label": "Sootopolis City - TM31 from Black Belt in House", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM34": { + "label": "Mauville Gym - TM34 from Wattson", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM36": { + "label": "Dewford Town - TM36 from Sludge Bomb Man", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM39": { + "label": "Rustboro Gym - TM39 from Roxanne", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM40": { + "label": "Fortree Gym - TM40 from Winona", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM41": { + "label": "Slateport City - TM41 from Sailor in Battle Tent", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM42": { + "label": "Petalburg Gym - TM42 from Norman", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM44": { + "label": "Lilycove City - TM44 from Man in House", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM45": { + "label": "Verdanturf Town - TM45 from Woman in Battle Tent", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM46": { + "label": "Slateport City - TM46 from Aqua Grunt in Museum", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM47": { + "label": "Granite Cave 1F - TM47 from Steven", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM49": { + "label": "SS Tidal - TM49 from Thief", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_TM50": { + "label": "Lavaridge Gym - TM50 from Flannery", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_WHITE_HERB": { + "label": "Route 104 - White Herb from Lady Near Flower Shop", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_DEEP_SEA_SCALE": { + "label": "Slateport City - Deep Sea Scale from Capt. Stern", + "tags": ["NpcGift"] + }, + "NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH": { + "label": "Slateport City - Deep Sea Tooth from Capt. Stern", + "tags": ["NpcGift"] + } +} diff --git a/worlds/pokemon_emerald/data/regions/cities.json b/worlds/pokemon_emerald/data/regions/cities.json new file mode 100644 index 000000000000..d39c0cc847c0 --- /dev/null +++ b/worlds/pokemon_emerald/data/regions/cities.json @@ -0,0 +1,2604 @@ +{ + "REGION_SKY": { + "parent_map": null, + "locations": [], + "events": [], + "exits": [ + "REGION_LITTLEROOT_TOWN/MAIN", + "REGION_OLDALE_TOWN/MAIN", + "REGION_PETALBURG_CITY/MAIN", + "REGION_RUSTBORO_CITY/MAIN", + "REGION_DEWFORD_TOWN/MAIN", + "REGION_SLATEPORT_CITY/MAIN", + "REGION_MAUVILLE_CITY/MAIN", + "REGION_VERDANTURF_TOWN/MAIN", + "REGION_FALLARBOR_TOWN/MAIN", + "REGION_LAVARIDGE_TOWN/MAIN", + "REGION_FORTREE_CITY/MAIN", + "REGION_LILYCOVE_CITY/MAIN", + "REGION_MOSSDEEP_CITY/MAIN", + "REGION_SOOTOPOLIS_CITY/EAST", + "REGION_EVER_GRANDE_CITY/SOUTH" + ], + "warps": [] + }, + + "REGION_LITTLEROOT_TOWN/MAIN": { + "parent_map": "MAP_LITTLEROOT_TOWN", + "locations": [], + "events": [ + "EVENT_VISITED_LITTLEROOT_TOWN", + "FREE_FLY_LOCATION" + ], + "exits": [ + "REGION_ROUTE101/MAIN", + "REGION_SKY" + ], + "warps": [ + "MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1", + "MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1", + "MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0" + ] + }, + "REGION_LITTLEROOT_TOWN_MAYS_HOUSE_1F/MAIN": { + "parent_map": "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0", + "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0" + ] + }, + "REGION_LITTLEROOT_TOWN_MAYS_HOUSE_2F/MAIN": { + "parent_map": "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2" + ] + }, + "REGION_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F/MAIN": { + "parent_map": "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F", + "locations": [ + "NPC_GIFT_RECEIVED_AMULET_COIN", + "NPC_GIFT_RECEIVED_SS_TICKET" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1", + "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0" + ] + }, + "REGION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F/MAIN": { + "parent_map": "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2" + ] + }, + "REGION_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB/MAIN": { + "parent_map": "MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2" + ] + }, + + "REGION_OLDALE_TOWN/MAIN": { + "parent_map": "MAP_OLDALE_TOWN", + "locations": [ + "NPC_GIFT_RECEIVED_POTION_OLDALE" + ], + "events": [ + "EVENT_VISITED_OLDALE_TOWN" + ], + "exits": [ + "REGION_ROUTE101/MAIN", + "REGION_ROUTE102/MAIN", + "REGION_ROUTE103/WEST" + ], + "warps": [ + "MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0", + "MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0", + "MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0", + "MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0" + ] + }, + "REGION_OLDALE_TOWN_HOUSE1/MAIN": { + "parent_map": "MAP_OLDALE_TOWN_HOUSE1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0" + ] + }, + "REGION_OLDALE_TOWN_HOUSE2/MAIN": { + "parent_map": "MAP_OLDALE_TOWN_HOUSE2", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1" + ] + }, + "REGION_OLDALE_TOWN_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_OLDALE_TOWN_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2", + "MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0" + ] + }, + "REGION_OLDALE_TOWN_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_OLDALE_TOWN_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2" + ] + }, + "REGION_OLDALE_TOWN_MART/MAIN": { + "parent_map": "MAP_OLDALE_TOWN_MART", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3" + ] + }, + + "REGION_PETALBURG_CITY/MAIN": { + "parent_map": "MAP_PETALBURG_CITY", + "locations": [], + "events": [ + "EVENT_VISITED_PETALBURG_CITY" + ], + "exits": [ + "REGION_PETALBURG_CITY/SOUTH_POND", + "REGION_PETALBURG_CITY/NORTH_POND", + "REGION_ROUTE102/MAIN", + "REGION_ROUTE104/SOUTH" + ], + "warps": [ + "MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0", + "MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0", + "MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0", + "MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0", + "MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0", + "MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0" + ] + }, + "REGION_PETALBURG_CITY/NORTH_POND": { + "parent_map": "MAP_PETALBURG_CITY", + "locations": [ + "ITEM_PETALBURG_CITY_MAX_REVIVE" + ], + "events": [], + "exits": [ + "REGION_PETALBURG_CITY/MAIN" + ], + "warps": [] + }, + "REGION_PETALBURG_CITY/SOUTH_POND": { + "parent_map": "MAP_PETALBURG_CITY", + "locations": [ + "ITEM_PETALBURG_CITY_ETHER", + "HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY" + ], + "events": [], + "exits": [ + "REGION_PETALBURG_CITY/MAIN" + ], + "warps": [] + }, + "REGION_PETALBURG_CITY_HOUSE1/MAIN": { + "parent_map": "MAP_PETALBURG_CITY_HOUSE1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0" + ] + }, + "REGION_PETALBURG_CITY_HOUSE2/MAIN": { + "parent_map": "MAP_PETALBURG_CITY_HOUSE2", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4" + ] + }, + "REGION_PETALBURG_CITY_WALLYS_HOUSE/MAIN": { + "parent_map": "MAP_PETALBURG_CITY_WALLYS_HOUSE", + "locations": [ + "NPC_GIFT_RECEIVED_HM03" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1" + ] + }, + "REGION_PETALBURG_CITY_GYM/ROOM_1": { + "parent_map": "MAP_PETALBURG_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2", + "MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3", + "MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6" + ] + }, + "REGION_PETALBURG_CITY_GYM/ROOM_2": { + "parent_map": "MAP_PETALBURG_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5", + "MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16", + "MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18" + ] + }, + "REGION_PETALBURG_CITY_GYM/ROOM_3": { + "parent_map": "MAP_PETALBURG_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2", + "MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10", + "MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12" + ] + }, + "REGION_PETALBURG_CITY_GYM/ROOM_4": { + "parent_map": "MAP_PETALBURG_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15", + "MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30" + ] + }, + "REGION_PETALBURG_CITY_GYM/ROOM_5": { + "parent_map": "MAP_PETALBURG_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9", + "MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14", + "MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26", + "MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28" + ] + }, + "REGION_PETALBURG_CITY_GYM/ROOM_6": { + "parent_map": "MAP_PETALBURG_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8", + "MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24" + ] + }, + "REGION_PETALBURG_CITY_GYM/ROOM_7": { + "parent_map": "MAP_PETALBURG_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22", + "MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23", + "MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36" + ] + }, + "REGION_PETALBURG_CITY_GYM/ROOM_8": { + "parent_map": "MAP_PETALBURG_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20", + "MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21", + "MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34" + ] + }, + "REGION_PETALBURG_CITY_GYM/ROOM_9": { + "parent_map": "MAP_PETALBURG_CITY_GYM", + "locations": [ + "NPC_GIFT_RECEIVED_TM42", + "BADGE_5" + ], + "events": [ + "EVENT_DEFEAT_NORMAN" + ], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32", + "MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33" + ] + }, + "REGION_PETALBURG_CITY_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_PETALBURG_CITY_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3", + "MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0" + ] + }, + "REGION_PETALBURG_CITY_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_PETALBURG_CITY_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2" + ] + }, + "REGION_PETALBURG_CITY_MART/MAIN": { + "parent_map": "MAP_PETALBURG_CITY_MART", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5" + ] + }, + + "REGION_RUSTBORO_CITY/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY", + "locations": [ + "ITEM_RUSTBORO_CITY_X_DEFEND", + "NPC_GIFT_RECEIVED_GREAT_BALL_RUSTBORO_CITY" + ], + "events": [ + "EVENT_RETURN_DEVON_GOODS", + "EVENT_VISITED_RUSTBORO_CITY" + ], + "exits": [ + "REGION_ROUTE104/NORTH", + "REGION_ROUTE115/SOUTH_BELOW_LEDGE", + "REGION_ROUTE116/WEST" + ], + "warps": [ + "MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0", + "MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0", + "MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0", + "MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0", + "MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0", + "MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1", + "MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0", + "MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0", + "MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0", + "MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0", + "MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0" + ] + }, + "REGION_RUSTBORO_CITY_GYM/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_GYM", + "locations": [ + "NPC_GIFT_RECEIVED_TM39", + "BADGE_1" + ], + "events": [ + "EVENT_DEFEAT_ROXANNE" + ], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0" + ] + }, + "REGION_RUSTBORO_CITY_MART/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_MART", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2" + ] + }, + "REGION_RUSTBORO_CITY_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3", + "MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0" + ] + }, + "REGION_RUSTBORO_CITY_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2" + ] + }, + "REGION_RUSTBORO_CITY_POKEMON_SCHOOL/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_POKEMON_SCHOOL", + "locations": [ + "NPC_GIFT_RECEIVED_QUICK_CLAW" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4" + ] + }, + "REGION_RUSTBORO_CITY_DEVON_CORP_1F/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_DEVON_CORP_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6", + "MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0" + ] + }, + "REGION_RUSTBORO_CITY_DEVON_CORP_2F/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_DEVON_CORP_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2", + "MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0" + ] + }, + "REGION_RUSTBORO_CITY_DEVON_CORP_3F/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_DEVON_CORP_3F", + "locations": [ + "NPC_GIFT_RECEIVED_LETTER", + "NPC_GIFT_RECEIVED_EXP_SHARE" + ], + "events": [ + "EVENT_TALK_TO_MR_STONE" + ], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1" + ] + }, + "REGION_RUSTBORO_CITY_FLAT1_1F/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_FLAT1_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1", + "MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0" + ] + }, + "REGION_RUSTBORO_CITY_FLAT1_2F/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_FLAT1_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2" + ] + }, + "REGION_RUSTBORO_CITY_FLAT2_1F/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_FLAT2_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10", + "MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0" + ] + }, + "REGION_RUSTBORO_CITY_FLAT2_2F/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_FLAT2_2F", + "locations": [ + "NPC_GIFT_RECEIVED_PREMIER_BALL_RUSTBORO" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2", + "MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0" + ] + }, + "REGION_RUSTBORO_CITY_FLAT2_3F/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_FLAT2_3F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1" + ] + }, + "REGION_RUSTBORO_CITY_HOUSE1/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_HOUSE1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7" + ] + }, + "REGION_RUSTBORO_CITY_HOUSE2/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_HOUSE2", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9" + ] + }, + "REGION_RUSTBORO_CITY_HOUSE3/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_HOUSE3", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11" + ] + }, + "REGION_RUSTBORO_CITY_CUTTERS_HOUSE/MAIN": { + "parent_map": "MAP_RUSTBORO_CITY_CUTTERS_HOUSE", + "locations": [ + "NPC_GIFT_RECEIVED_HM01" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8" + ] + }, + + "REGION_DEWFORD_TOWN/MAIN": { + "parent_map": "MAP_DEWFORD_TOWN", + "locations": [ + "NPC_GIFT_RECEIVED_OLD_ROD" + ], + "events": [ + "EVENT_VISITED_DEWFORD_TOWN" + ], + "exits": [ + "REGION_ROUTE106/EAST", + "REGION_ROUTE107/MAIN", + "REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN", + "REGION_ROUTE109/BEACH" + ], + "warps": [ + "MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0", + "MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0", + "MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0", + "MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0", + "MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0" + ] + }, + "REGION_DEWFORD_TOWN_HALL/MAIN": { + "parent_map": "MAP_DEWFORD_TOWN_HALL", + "locations": [ + "NPC_GIFT_RECEIVED_TM36" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0" + ] + }, + "REGION_DEWFORD_TOWN_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_DEWFORD_TOWN_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1", + "MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0" + ] + }, + "REGION_DEWFORD_TOWN_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_DEWFORD_TOWN_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2" + ] + }, + "REGION_DEWFORD_TOWN_GYM/MAIN": { + "parent_map": "MAP_DEWFORD_TOWN_GYM", + "locations": [ + "NPC_GIFT_RECEIVED_TM08", + "BADGE_2" + ], + "events": [ + "EVENT_DEFEAT_BRAWLY" + ], + "exits": [], + "warps": [ + "MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2" + ] + }, + "REGION_DEWFORD_TOWN_HOUSE1/MAIN": { + "parent_map": "MAP_DEWFORD_TOWN_HOUSE1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3" + ] + }, + "REGION_DEWFORD_TOWN_HOUSE2/MAIN": { + "parent_map": "MAP_DEWFORD_TOWN_HOUSE2", + "locations": [ + "NPC_GIFT_RECEIVED_SILK_SCARF" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4" + ] + }, + + "REGION_SLATEPORT_CITY/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY", + "locations": [ + "NPC_GIFT_RECEIVED_POWDER_JAR" + ], + "events": [ + "EVENT_AQUA_STEALS_SUBMARINE", + "EVENT_VISITED_SLATEPORT_CITY" + ], + "exits": [ + "REGION_ROUTE109/BEACH", + "REGION_ROUTE110/SOUTH", + "REGION_ROUTE134/WEST" + ], + "warps": [ + "MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0", + "MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0", + "MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0", + "MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0", + "MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0", + "MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1", + "MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0", + "MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0", + "MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2", + "MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0" + ] + }, + "REGION_SLATEPORT_CITY_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2" + ] + }, + "REGION_SLATEPORT_CITY_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0", + "MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0" + ] + }, + "REGION_SLATEPORT_CITY_MART/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_MART", + "locations": [], + "events": [ + "EVENT_BUY_HARBOR_MAIL" + ], + "exits": [], + "warps": [ + "MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1" + ] + }, + "REGION_SLATEPORT_CITY_STERNS_SHIPYARD_1F/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F", + "locations": [], + "events": [ + "EVENT_TALK_TO_DOCK" + ], + "exits": [], + "warps": [ + "MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2", + "MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0" + ] + }, + "REGION_SLATEPORT_CITY_STERNS_SHIPYARD_2F/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2" + ] + }, + "REGION_SLATEPORT_CITY_BATTLE_TENT_LOBBY/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY", + "locations": [ + "NPC_GIFT_RECEIVED_TM41" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3" + ] + }, + "REGION_SLATEPORT_CITY_POKEMON_FAN_CLUB/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB", + "locations": [ + "NPC_GIFT_RECEIVED_SOOTHE_BELL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4" + ] + }, + "REGION_SLATEPORT_CITY_OCEANIC_MUSEUM_1F/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F", + "locations": [ + "NPC_GIFT_RECEIVED_TM46" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7", + "MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0" + ] + }, + "REGION_SLATEPORT_CITY_OCEANIC_MUSEUM_2F/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F", + "locations": [], + "events": [ + "EVENT_RESCUE_CAPT_STERN" + ], + "exits": [], + "warps": [ + "MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2" + ] + }, + "REGION_SLATEPORT_CITY_NAME_RATERS_HOUSE/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6" + ] + }, + "REGION_SLATEPORT_CITY_HARBOR/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_HARBOR", + "locations": [ + "NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH", + "NPC_GIFT_RECEIVED_DEEP_SEA_SCALE" + ], + "events": [], + "exits": [ + "REGION_SS_TIDAL_CORRIDOR/MAIN" + ], + "warps": [ + "MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8", + "MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9" + ] + }, + "REGION_SLATEPORT_CITY_HOUSE/MAIN": { + "parent_map": "MAP_SLATEPORT_CITY_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10" + ] + }, + + "REGION_MAUVILLE_CITY/MAIN": { + "parent_map": "MAP_MAUVILLE_CITY", + "locations": [ + "ITEM_MAUVILLE_CITY_X_SPEED", + "NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON", + "NPC_GIFT_GOT_TM24_FROM_WATTSON" + ], + "events": [ + "EVENT_VISITED_MAUVILLE_CITY" + ], + "exits": [ + "REGION_ROUTE111/SOUTH", + "REGION_ROUTE117/MAIN", + "REGION_ROUTE110/MAIN", + "REGION_ROUTE118/WEST" + ], + "warps": [ + "MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0", + "MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0", + "MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0", + "MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0", + "MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0", + "MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0", + "MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0" + ] + }, + "REGION_MAUVILLE_CITY_GYM/MAIN": { + "parent_map": "MAP_MAUVILLE_CITY_GYM", + "locations": [ + "NPC_GIFT_RECEIVED_TM34", + "BADGE_3" + ], + "events": [ + "EVENT_DEFEAT_WATTSON" + ], + "exits": [], + "warps": [ + "MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0" + ] + }, + "REGION_MAUVILLE_CITY_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_MAUVILLE_CITY_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1", + "MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0" + ] + }, + "REGION_MAUVILLE_CITY_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_MAUVILLE_CITY_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2" + ] + }, + "REGION_MAUVILLE_CITY_BIKE_SHOP/MAIN": { + "parent_map": "MAP_MAUVILLE_CITY_BIKE_SHOP", + "locations": [ + "NPC_GIFT_RECEIVED_ACRO_BIKE", + "NPC_GIFT_RECEIVED_MACH_BIKE" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2" + ] + }, + "REGION_MAUVILLE_CITY_MART/MAIN": { + "parent_map": "MAP_MAUVILLE_CITY_MART", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3" + ] + }, + "REGION_MAUVILLE_CITY_HOUSE1/MAIN": { + "parent_map": "MAP_MAUVILLE_CITY_HOUSE1", + "locations": [ + "NPC_GIFT_RECEIVED_HM06" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4" + ] + }, + "REGION_MAUVILLE_CITY_HOUSE2/MAIN": { + "parent_map": "MAP_MAUVILLE_CITY_HOUSE2", + "locations": [ + "NPC_GIFT_RECEIVED_COIN_CASE" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6" + ] + }, + "REGION_MAUVILLE_CITY_GAME_CORNER/MAIN": { + "parent_map": "MAP_MAUVILLE_CITY_GAME_CORNER", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5" + ] + }, + + "REGION_VERDANTURF_TOWN/MAIN": { + "parent_map": "MAP_VERDANTURF_TOWN", + "locations": [], + "events": [ + "EVENT_VISITED_VERDANTURF_TOWN" + ], + "exits": [ + "REGION_ROUTE117/MAIN" + ], + "warps": [ + "MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0", + "MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0", + "MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0", + "MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0", + "MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1", + "MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0", + "MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0" + ] + }, + "REGION_VERDANTURF_TOWN_BATTLE_TENT_LOBBY/MAIN": { + "parent_map": "MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY", + "locations": [ + "NPC_GIFT_RECEIVED_TM45" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0" + ] + }, + "REGION_VERDANTURF_TOWN_MART/MAIN": { + "parent_map": "MAP_VERDANTURF_TOWN_MART", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1" + ] + }, + "REGION_VERDANTURF_TOWN_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2", + "MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0" + ] + }, + "REGION_VERDANTURF_TOWN_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2" + ] + }, + "REGION_VERDANTURF_TOWN_WANDAS_HOUSE/MAIN": { + "parent_map": "MAP_VERDANTURF_TOWN_WANDAS_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3" + ] + }, + "REGION_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE/MAIN": { + "parent_map": "MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5" + ] + }, + "REGION_VERDANTURF_TOWN_HOUSE/MAIN": { + "parent_map": "MAP_VERDANTURF_TOWN_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6" + ] + }, + + "REGION_FALLARBOR_TOWN/MAIN": { + "parent_map": "MAP_FALLARBOR_TOWN", + "locations": [ + "HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET" + ], + "events": [ + "EVENT_VISITED_FALLARBOR_TOWN" + ], + "exits": [ + "REGION_ROUTE114/MAIN", + "REGION_ROUTE113/MAIN" + ], + "warps": [ + "MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0", + "MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0", + "MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0", + "MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0", + "MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0" + ] + }, + "REGION_FALLARBOR_TOWN_MART/MAIN": { + "parent_map": "MAP_FALLARBOR_TOWN_MART", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0" + ] + }, + "REGION_FALLARBOR_TOWN_BATTLE_TENT_LOBBY/MAIN": { + "parent_map": "MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1" + ] + }, + "REGION_FALLARBOR_TOWN_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2", + "MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0" + ] + }, + "REGION_FALLARBOR_TOWN_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2" + ] + }, + "REGION_FALLARBOR_TOWN_COZMOS_HOUSE/MAIN": { + "parent_map": "MAP_FALLARBOR_TOWN_COZMOS_HOUSE", + "locations": [ + "NPC_GIFT_RECEIVED_TM27" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3" + ] + }, + "REGION_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE/MAIN": { + "parent_map": "MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4" + ] + }, + + "REGION_LAVARIDGE_TOWN/MAIN": { + "parent_map": "MAP_LAVARIDGE_TOWN", + "locations": [ + "NPC_GIFT_RECEIVED_GO_GOGGLES" + ], + "events": [ + "EVENT_VISITED_LAVARIDGE_TOWN" + ], + "exits": [ + "REGION_ROUTE112/SOUTH_WEST" + ], + "warps": [ + "MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0", + "MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0", + "MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0", + "MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0", + "MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0" + ] + }, + "REGION_LAVARIDGE_TOWN/SPRINGS": { + "parent_map": "MAP_LAVARIDGE_TOWN", + "locations": [ + "HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3" + ] + }, + "REGION_LAVARIDGE_TOWN_HERB_SHOP/MAIN": { + "parent_map": "MAP_LAVARIDGE_TOWN_HERB_SHOP", + "locations": [ + "NPC_GIFT_RECEIVED_CHARCOAL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_1F/ENTRANCE": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1", + "MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0", + "MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2", + "MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_1F/BOTTOM_LEFT_LOWER": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4", + "MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1", + "MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6", + "MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7", + "MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8", + "MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9", + "MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10", + "MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_1F/BOTTOM_LEFT_UPPER": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_LAVARIDGE_TOWN_GYM_1F/BOTTOM_LEFT_LOWER" + ], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3", + "MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_1F/TOP_LEFT": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11", + "MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12", + "MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13", + "MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14", + "MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_1F/TOP_CENTER": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16", + "MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17", + "MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_1F/TOP_RIGHT": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19", + "MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_1F/FLANNERY": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_1F", + "locations": [ + "NPC_GIFT_RECEIVED_TM50", + "BADGE_4" + ], + "events": [ + "EVENT_DEFEAT_FLANNERY" + ], + "exits": [ + "REGION_LAVARIDGE_TOWN_GYM_1F/ENTRANCE" + ], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_B1F/TOP": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16", + "MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17", + "MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18", + "MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_LEFT_LOWER": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6", + "MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3", + "MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5", + "MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4", + "MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8", + "MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9", + "MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10", + "MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19", + "MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_LEFT_UPPER_1": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_LEFT_LOWER" + ], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11", + "MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12", + "MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13", + "MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_LEFT_UPPER_2": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_LEFT_LOWER" + ], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7", + "MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_RIGHT_LOWER": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2", + "MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_RIGHT_MIDDLE": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_RIGHT_LOWER" + ], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_RIGHT_UPPER_1": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_RIGHT_MIDDLE" + ], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20" + ] + }, + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_RIGHT_UPPER_2": { + "parent_map": "MAP_LAVARIDGE_TOWN_GYM_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_LAVARIDGE_TOWN_GYM_B1F/BOTTOM_RIGHT_LOWER" + ], + "warps": [ + "MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23" + ] + }, + "REGION_LAVARIDGE_TOWN_MART/MAIN": { + "parent_map": "MAP_LAVARIDGE_TOWN_MART", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2" + ] + }, + "REGION_LAVARIDGE_TOWN_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3", + "MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0", + "MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5" + ] + }, + "REGION_LAVARIDGE_TOWN_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2" + ] + }, + "REGION_LAVARIDGE_TOWN_HOUSE/MAIN": { + "parent_map": "MAP_LAVARIDGE_TOWN_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4" + ] + }, + + "REGION_FORTREE_CITY/MAIN": { + "parent_map": "MAP_FORTREE_CITY", + "locations": [], + "events": [ + "EVENT_VISITED_FORTREE_CITY" + ], + "exits": [ + "REGION_FORTREE_CITY/BEFORE_GYM", + "REGION_ROUTE119/UPPER", + "REGION_ROUTE120/NORTH" + ], + "warps": [ + "MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0", + "MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0", + "MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0", + "MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0", + "MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0", + "MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0", + "MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0", + "MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0" + ] + }, + "REGION_FORTREE_CITY/BEFORE_GYM": { + "parent_map": "MAP_FORTREE_CITY", + "locations": [], + "events": [], + "exits": [ + "REGION_FORTREE_CITY/MAIN" + ], + "warps": [ + "MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0" + ] + }, + "REGION_FORTREE_CITY_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_FORTREE_CITY_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0", + "MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0" + ] + }, + "REGION_FORTREE_CITY_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_FORTREE_CITY_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2" + ] + }, + "REGION_FORTREE_CITY_HOUSE1/MAIN": { + "parent_map": "MAP_FORTREE_CITY_HOUSE1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1" + ] + }, + "REGION_FORTREE_CITY_HOUSE2/MAIN": { + "parent_map": "MAP_FORTREE_CITY_HOUSE2", + "locations": [ + "NPC_GIFT_RECEIVED_TM10" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4" + ] + }, + "REGION_FORTREE_CITY_HOUSE3/MAIN": { + "parent_map": "MAP_FORTREE_CITY_HOUSE3", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5" + ] + }, + "REGION_FORTREE_CITY_HOUSE4/MAIN": { + "parent_map": "MAP_FORTREE_CITY_HOUSE4", + "locations": [ + "NPC_GIFT_RECEIVED_MENTAL_HERB" + ], + "events": [ + "EVENT_WINGULL_QUEST_1" + ], + "exits": [], + "warps": [ + "MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6" + ] + }, + "REGION_FORTREE_CITY_HOUSE5/MAIN": { + "parent_map": "MAP_FORTREE_CITY_HOUSE5", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7" + ] + }, + "REGION_FORTREE_CITY_GYM/MAIN": { + "parent_map": "MAP_FORTREE_CITY_GYM", + "locations": [ + "NPC_GIFT_RECEIVED_TM40", + "BADGE_6" + ], + "events": [ + "EVENT_DEFEAT_WINONA" + ], + "exits": [], + "warps": [ + "MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2" + ] + }, + "REGION_FORTREE_CITY_MART/MAIN": { + "parent_map": "MAP_FORTREE_CITY_MART", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3" + ] + }, + "REGION_FORTREE_CITY_DECORATION_SHOP/MAIN": { + "parent_map": "MAP_FORTREE_CITY_DECORATION_SHOP", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8" + ] + }, + + "REGION_LILYCOVE_CITY/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY", + "locations": [ + "ITEM_LILYCOVE_CITY_MAX_REPEL", + "HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE", + "HIDDEN_ITEM_LILYCOVE_CITY_PP_UP", + "HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL" + ], + "events": [ + "EVENT_VISITED_LILYCOVE_CITY" + ], + "exits": [ + "REGION_ROUTE121/EAST", + "REGION_LILYCOVE_CITY/SEA" + ], + "warps": [ + "MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0", + "MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0", + "MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0", + "MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1", + "MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0", + "MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1", + "MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0", + "MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0", + "MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0", + "MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0", + "MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0", + "MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0" + ] + }, + "REGION_LILYCOVE_CITY/SEA": { + "parent_map": "MAP_LILYCOVE_CITY", + "locations": [], + "events": [], + "exits": [ + "REGION_LILYCOVE_CITY/MAIN", + "REGION_ROUTE124/MAIN" + ], + "warps": [ + "MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0" + ] + }, + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_1F/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR/MAIN" + ], + "warps": [ + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0", + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0" + ] + }, + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_2F/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F", + "locations": [], + "events": [], + "exits": [ + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR/MAIN" + ], + "warps": [ + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2", + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0" + ] + }, + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_3F/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F", + "locations": [], + "events": [], + "exits": [ + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR/MAIN" + ], + "warps": [ + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1", + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0" + ] + }, + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_4F/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F", + "locations": [], + "events": [], + "exits": [ + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR/MAIN" + ], + "warps": [ + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1", + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0" + ] + }, + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_5F/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F", + "locations": [], + "events": [], + "exits": [ + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR/MAIN" + ], + "warps": [ + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1", + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0" + ] + }, + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2" + ] + }, + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR", + "locations": [], + "events": [], + "exits": [ + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_1F/MAIN", + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_2F/MAIN", + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_3F/MAIN", + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_4F/MAIN", + "REGION_LILYCOVE_CITY_DEPARTMENT_STORE_5F/MAIN" + ], + "warps": [] + }, + "REGION_LILYCOVE_CITY_COVE_LILY_MOTEL_1F/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1", + "MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0" + ] + }, + "REGION_LILYCOVE_CITY_COVE_LILY_MOTEL_2F/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2" + ] + }, + "REGION_LILYCOVE_CITY_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2", + "MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0" + ] + }, + "REGION_LILYCOVE_CITY_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2" + ] + }, + "REGION_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13", + "MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0" + ] + }, + "REGION_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2" + ] + }, + "REGION_LILYCOVE_CITY_CONTEST_LOBBY/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_CONTEST_LOBBY", + "locations": [ + "NPC_GIFT_RECEIVED_POKEBLOCK_CASE" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4", + "MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0", + "MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1" + ] + }, + "REGION_LILYCOVE_CITY_CONTEST_HALL/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_CONTEST_HALL", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2", + "MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3" + ] + }, + "REGION_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5" + ] + }, + "REGION_LILYCOVE_CITY_MOVE_DELETERS_HOUSE/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7" + ] + }, + "REGION_LILYCOVE_CITY_HOUSE1/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_HOUSE1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8" + ] + }, + "REGION_LILYCOVE_CITY_HOUSE2/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_HOUSE2", + "locations": [ + "NPC_GIFT_RECEIVED_TM44" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9" + ] + }, + "REGION_LILYCOVE_CITY_HOUSE3/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_HOUSE3", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10" + ] + }, + "REGION_LILYCOVE_CITY_HOUSE4/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_HOUSE4", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11" + ] + }, + "REGION_LILYCOVE_CITY_HARBOR/MAIN": { + "parent_map": "MAP_LILYCOVE_CITY_HARBOR", + "locations": [], + "events": [], + "exits": [ + "REGION_SS_TIDAL_CORRIDOR/MAIN" + ], + "warps": [ + "MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12" + ] + }, + "REGION_SS_TIDAL_CORRIDOR/MAIN": { + "parent_map": "MAP_SS_TIDAL_CORRIDOR", + "locations": [], + "events": [], + "exits": [ + "REGION_SLATEPORT_CITY_HARBOR/MAIN", + "REGION_LILYCOVE_CITY_HARBOR/MAIN" + ], + "warps": [ + "MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0", + "MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8", + "MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2", + "MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9", + "MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4", + "MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10", + "MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6", + "MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11", + "MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0" + ] + }, + "REGION_SS_TIDAL_ROOMS/MAIN": { + "parent_map": "MAP_SS_TIDAL_ROOMS", + "locations": [ + "NPC_GIFT_RECEIVED_TM49" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0", + "MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4", + "MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1", + "MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5", + "MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2", + "MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6", + "MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3", + "MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7" + ] + }, + "REGION_SS_TIDAL_LOWER_DECK/MAIN": { + "parent_map": "MAP_SS_TIDAL_LOWER_DECK", + "locations": [ + "HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8" + ] + }, + + "REGION_MOSSDEEP_CITY/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY", + "locations": [ + "ITEM_MOSSDEEP_CITY_NET_BALL", + "NPC_GIFT_RECEIVED_KINGS_ROCK" + ], + "events": [ + "EVENT_VISITED_MOSSDEEP_CITY" + ], + "exits": [ + "REGION_ROUTE124/MAIN", + "REGION_ROUTE125/SEA", + "REGION_ROUTE127/MAIN" + ], + "warps": [ + "MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0", + "MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0", + "MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0", + "MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0", + "MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0", + "MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0", + "MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0", + "MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1", + "MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0", + "MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0" + ] + }, + "REGION_MOSSDEEP_CITY_GYM/ROOM_1": { + "parent_map": "MAP_MOSSDEEP_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1", + "MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3", + "MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9" + ] + }, + "REGION_MOSSDEEP_CITY_GYM/ROOM_2": { + "parent_map": "MAP_MOSSDEEP_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2", + "MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5", + "MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7" + ] + }, + "REGION_MOSSDEEP_CITY_GYM/ROOM_3": { + "parent_map": "MAP_MOSSDEEP_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4", + "MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11" + ] + }, + "REGION_MOSSDEEP_CITY_GYM/ROOM_4": { + "parent_map": "MAP_MOSSDEEP_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10", + "MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13" + ] + }, + "REGION_MOSSDEEP_CITY_GYM/ROOM_5": { + "parent_map": "MAP_MOSSDEEP_CITY_GYM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6", + "MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8" + ] + }, + "REGION_MOSSDEEP_CITY_GYM/ROOM_6": { + "parent_map": "MAP_MOSSDEEP_CITY_GYM", + "locations": [ + "NPC_GIFT_RECEIVED_TM04", + "BADGE_7" + ], + "events": [ + "EVENT_DEFEAT_TATE_AND_LIZA" + ], + "exits": [ + "REGION_MOSSDEEP_CITY_GYM/ROOM_1" + ], + "warps": [ + "MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12" + ] + }, + "REGION_MOSSDEEP_CITY_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2", + "MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0" + ] + }, + "REGION_MOSSDEEP_CITY_MART/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_MART", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4" + ] + }, + "REGION_MOSSDEEP_CITY_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2" + ] + }, + "REGION_MOSSDEEP_CITY_SPACE_CENTER_1F/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_SPACE_CENTER_1F", + "locations": [ + "NPC_GIFT_RECEIVED_SUN_STONE_MOSSDEEP" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8", + "MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0" + ] + }, + "REGION_MOSSDEEP_CITY_SPACE_CENTER_2F/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_SPACE_CENTER_2F", + "locations": [], + "events": [ + "EVENT_DEFEAT_MAXIE_AT_SPACE_STATION" + ], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2" + ] + }, + "REGION_MOSSDEEP_CITY_GAME_CORNER_1F/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_GAME_CORNER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9", + "MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0" + ] + }, + "REGION_MOSSDEEP_CITY_GAME_CORNER_B1F/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_GAME_CORNER_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2" + ] + }, + "REGION_MOSSDEEP_CITY_STEVENS_HOUSE/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_STEVENS_HOUSE", + "locations": [ + "NPC_GIFT_RECEIVED_HM08" + ], + "events": [ + "EVENT_STEVEN_GIVES_DIVE" + ], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6" + ] + }, + "REGION_MOSSDEEP_CITY_HOUSE1/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_HOUSE1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0" + ] + }, + "REGION_MOSSDEEP_CITY_HOUSE2/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_HOUSE2", + "locations": [], + "events": [ + "EVENT_WINGULL_QUEST_2" + ], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3" + ] + }, + "REGION_MOSSDEEP_CITY_HOUSE3/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_HOUSE3", + "locations": [ + "NPC_GIFT_RECEIVED_SUPER_ROD" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5" + ] + }, + "REGION_MOSSDEEP_CITY_HOUSE4/MAIN": { + "parent_map": "MAP_MOSSDEEP_CITY_HOUSE4", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7" + ] + }, + + "REGION_UNDERWATER_SOOTOPOLIS_CITY/MAIN": { + "parent_map": "MAP_UNDERWATER_SOOTOPOLIS_CITY", + "locations": [], + "events": [], + "exits": [ + "REGION_SOOTOPOLIS_CITY/WATER" + ], + "warps": [ + "MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0" + ] + }, + "REGION_SOOTOPOLIS_CITY/WATER": { + "parent_map": "MAP_SOOTOPOLIS_CITY", + "locations": [], + "events": [], + "exits": [ + "REGION_UNDERWATER_SOOTOPOLIS_CITY/MAIN", + "REGION_SOOTOPOLIS_CITY/EAST", + "REGION_SOOTOPOLIS_CITY/WEST", + "REGION_SOOTOPOLIS_CITY/ISLAND" + ], + "warps": [] + }, + "REGION_SOOTOPOLIS_CITY/EAST": { + "parent_map": "MAP_SOOTOPOLIS_CITY", + "locations": [], + "events": [ + "EVENT_VISITED_SOOTOPOLIS_CITY" + ], + "exits": [ + "REGION_SOOTOPOLIS_CITY/WATER" + ], + "warps": [ + "MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0", + "MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0", + "MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0", + "MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0", + "MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0", + "MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0" + ] + }, + "REGION_SOOTOPOLIS_CITY/WEST": { + "parent_map": "MAP_SOOTOPOLIS_CITY", + "locations": [], + "events": [], + "exits": [ + "REGION_SOOTOPOLIS_CITY/WATER" + ], + "warps": [ + "MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0", + "MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0", + "MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0", + "MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0", + "MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0", + "MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0" + ] + }, + "REGION_SOOTOPOLIS_CITY/ISLAND": { + "parent_map": "MAP_SOOTOPOLIS_CITY", + "locations": [ + "NPC_GIFT_RECEIVED_HM07" + ], + "events": [], + "exits": [ + "REGION_SOOTOPOLIS_CITY/WATER" + ], + "warps": [ + "MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0" + ] + }, + "REGION_SOOTOPOLIS_CITY_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0", + "MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0" + ] + }, + "REGION_SOOTOPOLIS_CITY_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2" + ] + }, + "REGION_SOOTOPOLIS_CITY_MART/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_MART", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1" + ] + }, + "REGION_SOOTOPOLIS_CITY_GYM_1F/ENTRANCE": { + "parent_map": "MAP_SOOTOPOLIS_CITY_GYM_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_SOOTOPOLIS_CITY_GYM_1F/PUZZLE_1" + ], + "warps": [ + "MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2", + "MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0" + ] + }, + "REGION_SOOTOPOLIS_CITY_GYM_1F/PUZZLE_1": { + "parent_map": "MAP_SOOTOPOLIS_CITY_GYM_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_SOOTOPOLIS_CITY_GYM_1F/ENTRANCE", + "REGION_SOOTOPOLIS_CITY_GYM_1F/PUZZLE_2", + "REGION_SOOTOPOLIS_CITY_GYM_B1F/LEVEL_2" + ], + "warps": [] + }, + "REGION_SOOTOPOLIS_CITY_GYM_1F/PUZZLE_2": { + "parent_map": "MAP_SOOTOPOLIS_CITY_GYM_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_SOOTOPOLIS_CITY_GYM_1F/PUZZLE_1", + "REGION_SOOTOPOLIS_CITY_GYM_1F/PUZZLE_3", + "REGION_SOOTOPOLIS_CITY_GYM_B1F/LEVEL_3" + ], + "warps": [] + }, + "REGION_SOOTOPOLIS_CITY_GYM_1F/PUZZLE_3": { + "parent_map": "MAP_SOOTOPOLIS_CITY_GYM_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_SOOTOPOLIS_CITY_GYM_1F/PUZZLE_2", + "REGION_SOOTOPOLIS_CITY_GYM_1F/TOP", + "REGION_SOOTOPOLIS_CITY_GYM_B1F/LEVEL_4" + ], + "warps": [] + }, + "REGION_SOOTOPOLIS_CITY_GYM_1F/TOP": { + "parent_map": "MAP_SOOTOPOLIS_CITY_GYM_1F", + "locations": [ + "NPC_GIFT_RECEIVED_TM03", + "BADGE_8" + ], + "events": [ + "EVENT_DEFEAT_JUAN" + ], + "exits": [ + "REGION_SOOTOPOLIS_CITY_GYM_1F/PUZZLE_3" + ], + "warps": [] + }, + "REGION_SOOTOPOLIS_CITY_GYM_B1F/LEVEL_1": { + "parent_map": "MAP_SOOTOPOLIS_CITY_GYM_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2" + ] + }, + "REGION_SOOTOPOLIS_CITY_GYM_B1F/LEVEL_2": { + "parent_map": "MAP_SOOTOPOLIS_CITY_GYM_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_SOOTOPOLIS_CITY_GYM_B1F/LEVEL_1" + ], + "warps": [] + }, + "REGION_SOOTOPOLIS_CITY_GYM_B1F/LEVEL_3": { + "parent_map": "MAP_SOOTOPOLIS_CITY_GYM_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_SOOTOPOLIS_CITY_GYM_B1F/LEVEL_2" + ], + "warps": [] + }, + "REGION_SOOTOPOLIS_CITY_GYM_B1F/LEVEL_4": { + "parent_map": "MAP_SOOTOPOLIS_CITY_GYM_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_SOOTOPOLIS_CITY_GYM_B1F/LEVEL_3" + ], + "warps": [] + }, + "REGION_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12", + "MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0" + ] + }, + "REGION_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2" + ] + }, + "REGION_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11" + ] + }, + "REGION_SOOTOPOLIS_CITY_HOUSE1/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_HOUSE1", + "locations": [ + "NPC_GIFT_RECEIVED_TM31" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4" + ] + }, + "REGION_SOOTOPOLIS_CITY_HOUSE2/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_HOUSE2", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5" + ] + }, + "REGION_SOOTOPOLIS_CITY_HOUSE3/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_HOUSE3", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6" + ] + }, + "REGION_SOOTOPOLIS_CITY_HOUSE4/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_HOUSE4", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7" + ] + }, + "REGION_SOOTOPOLIS_CITY_HOUSE5/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_HOUSE5", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8" + ] + }, + "REGION_SOOTOPOLIS_CITY_HOUSE6/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_HOUSE6", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9" + ] + }, + "REGION_SOOTOPOLIS_CITY_HOUSE7/MAIN": { + "parent_map": "MAP_SOOTOPOLIS_CITY_HOUSE7", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10" + ] + }, + + "REGION_PACIFIDLOG_TOWN/MAIN": { + "parent_map": "MAP_PACIFIDLOG_TOWN", + "locations": [], + "events": [ + "EVENT_VISITED_PACIFIDLOG_TOWN" + ], + "exits": [ + "REGION_ROUTE131/MAIN", + "REGION_ROUTE132/EAST" + ], + "warps": [ + "MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0", + "MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0", + "MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0", + "MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0", + "MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0", + "MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0" + ] + }, + "REGION_PACIFIDLOG_TOWN_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0", + "MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0" + ] + }, + "REGION_PACIFIDLOG_TOWN_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2" + ] + }, + "REGION_PACIFIDLOG_TOWN_HOUSE1/MAIN": { + "parent_map": "MAP_PACIFIDLOG_TOWN_HOUSE1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1" + ] + }, + "REGION_PACIFIDLOG_TOWN_HOUSE2/MAIN": { + "parent_map": "MAP_PACIFIDLOG_TOWN_HOUSE2", + "locations": [ + "NPC_GIFT_RECEIVED_TM27_2", + "NPC_GIFT_RECEIVED_TM21" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2" + ] + }, + "REGION_PACIFIDLOG_TOWN_HOUSE3/MAIN": { + "parent_map": "MAP_PACIFIDLOG_TOWN_HOUSE3", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3" + ] + }, + "REGION_PACIFIDLOG_TOWN_HOUSE4/MAIN": { + "parent_map": "MAP_PACIFIDLOG_TOWN_HOUSE4", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4" + ] + }, + "REGION_PACIFIDLOG_TOWN_HOUSE5/MAIN": { + "parent_map": "MAP_PACIFIDLOG_TOWN_HOUSE5", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5" + ] + }, + + "REGION_EVER_GRANDE_CITY/SEA": { + "parent_map": "MAP_EVER_GRANDE_CITY", + "locations": [], + "events": [], + "exits": [ + "REGION_EVER_GRANDE_CITY/SOUTH", + "REGION_ROUTE128/MAIN" + ], + "warps": [] + }, + "REGION_EVER_GRANDE_CITY/SOUTH": { + "parent_map": "MAP_EVER_GRANDE_CITY", + "locations": [], + "events": [ + "EVENT_VISITED_EVER_GRANDE_CITY" + ], + "exits": [ + "REGION_EVER_GRANDE_CITY/SEA" + ], + "warps": [ + "MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0", + "MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0" + ] + }, + "REGION_EVER_GRANDE_CITY/NORTH": { + "parent_map": "MAP_EVER_GRANDE_CITY", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0", + "MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1" + ] + }, + "REGION_EVER_GRANDE_CITY_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1", + "MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0" + ] + }, + "REGION_EVER_GRANDE_CITY_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2" + ] + }, + "REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/BEHIND_BADGE_CHECKERS" + ], + "warps": [ + "MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0", + "MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0" + ] + }, + "REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/BEHIND_BADGE_CHECKERS": { + "parent_map": "MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/MAIN" + ], + "warps": [ + "MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0" + ] + }, + "REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4" + ] + }, + "REGION_EVER_GRANDE_CITY_HALL5/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_HALL5", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2", + "MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0" + ] + }, + "REGION_EVER_GRANDE_CITY_SIDNEYS_ROOM/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1", + "MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0" + ] + }, + "REGION_EVER_GRANDE_CITY_HALL1/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_HALL1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1", + "MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0" + ] + }, + "REGION_EVER_GRANDE_CITY_PHOEBES_ROOM/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_PHOEBES_ROOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1", + "MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0" + ] + }, + "REGION_EVER_GRANDE_CITY_HALL2/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_HALL2", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1", + "MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0" + ] + }, + "REGION_EVER_GRANDE_CITY_GLACIAS_ROOM/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_GLACIAS_ROOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1", + "MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0" + ] + }, + "REGION_EVER_GRANDE_CITY_HALL3/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_HALL3", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1", + "MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0" + ] + }, + "REGION_EVER_GRANDE_CITY_DRAKES_ROOM/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_DRAKES_ROOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1", + "MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0" + ] + }, + "REGION_EVER_GRANDE_CITY_CHAMPIONS_ROOM/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM", + "locations": [], + "events": [ + "EVENT_DEFEAT_CHAMPION" + ], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1", + "MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0" + ] + }, + "REGION_EVER_GRANDE_CITY_HALL4/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_HALL4", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1", + "MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0" + ] + }, + "REGION_EVER_GRANDE_CITY_HALL_OF_FAME/MAIN": { + "parent_map": "MAP_EVER_GRANDE_CITY_HALL_OF_FAME", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1" + ] + } +} diff --git a/worlds/pokemon_emerald/data/regions/dungeons.json b/worlds/pokemon_emerald/data/regions/dungeons.json new file mode 100644 index 000000000000..1da5e325bad0 --- /dev/null +++ b/worlds/pokemon_emerald/data/regions/dungeons.json @@ -0,0 +1,2231 @@ +{ + "REGION_PETALBURG_WOODS/WEST_PATH": { + "parent_map": "MAP_PETALBURG_WOODS", + "locations": [ + "ITEM_PETALBURG_WOODS_ETHER", + "ITEM_PETALBURG_WOODS_PARALYZE_HEAL", + "HIDDEN_ITEM_PETALBURG_WOODS_POTION", + "HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL", + "NPC_GIFT_RECEIVED_GREAT_BALL_PETALBURG_WOODS" + ], + "events": [], + "exits": [ + "REGION_PETALBURG_WOODS/EAST_PATH" + ], + "warps": [ + "MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3", + "MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5", + "MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7" + ] + }, + "REGION_PETALBURG_WOODS/EAST_PATH": { + "parent_map": "MAP_PETALBURG_WOODS", + "locations": [ + "ITEM_PETALBURG_WOODS_GREAT_BALL", + "ITEM_PETALBURG_WOODS_X_ATTACK", + "HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1", + "HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2", + "NPC_GIFT_RECEIVED_MIRACLE_SEED" + ], + "events": [], + "exits": [ + "REGION_PETALBURG_WOODS/WEST_PATH" + ], + "warps": [] + }, + "REGION_RUSTURF_TUNNEL/WEST": { + "parent_map": "MAP_RUSTURF_TUNNEL", + "locations": [ + "ITEM_RUSTURF_TUNNEL_POKE_BALL", + "NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL" + ], + "events": [ + "EVENT_RECOVER_DEVON_GOODS" + ], + "exits": [ + "REGION_RUSTURF_TUNNEL/EAST" + ], + "warps": [ + "MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0" + ] + }, + "REGION_RUSTURF_TUNNEL/EAST": { + "parent_map": "MAP_RUSTURF_TUNNEL", + "locations": [ + "ITEM_RUSTURF_TUNNEL_MAX_ETHER", + "NPC_GIFT_RECEIVED_HM04" + ], + "events": [], + "exits": [ + "REGION_RUSTURF_TUNNEL/WEST" + ], + "warps": [ + "MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4", + "MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2" + ] + }, + "REGION_GRANITE_CAVE_1F/LOWER": { + "parent_map": "MAP_GRANITE_CAVE_1F", + "locations": [ + "ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE", + "NPC_GIFT_RECEIVED_HM05" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0", + "MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1" + ] + }, + "REGION_GRANITE_CAVE_1F/UPPER": { + "parent_map": "MAP_GRANITE_CAVE_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_GRANITE_CAVE_1F/LOWER" + ], + "warps": [ + "MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0", + "MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0" + ] + }, + "REGION_GRANITE_CAVE_B1F/LOWER": { + "parent_map": "MAP_GRANITE_CAVE_B1F", + "locations": [ + "ITEM_GRANITE_CAVE_B1F_POKE_BALL" + ], + "events": [], + "exits": [ + "REGION_GRANITE_CAVE_B1F/UPPER" + ], + "warps": [ + "MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2", + "MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1" + ] + }, + "REGION_GRANITE_CAVE_B1F/LOWER_PLATFORM": { + "parent_map": "MAP_GRANITE_CAVE_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1", + "MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0" + ] + }, + "REGION_GRANITE_CAVE_B1F/UPPER": { + "parent_map": "MAP_GRANITE_CAVE_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_GRANITE_CAVE_B1F/UPPER" + ], + "warps": [ + "MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2", + "MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3", + "MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4" + ] + }, + "REGION_GRANITE_CAVE_B2F/NORTH_LOWER_LANDING": { + "parent_map": "MAP_GRANITE_CAVE_B2F", + "locations": [ + "ITEM_GRANITE_CAVE_B2F_REPEL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4" + ] + }, + "REGION_GRANITE_CAVE_B2F/NORTH_UPPER_LANDING": { + "parent_map": "MAP_GRANITE_CAVE_B2F", + "locations": [], + "events": [], + "exits": [ + "REGION_GRANITE_CAVE_B2F/NORTH_LOWER_LANDING" + ], + "warps": [ + "MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5" + ] + }, + "REGION_GRANITE_CAVE_B2F/NORTH_EAST_ROOM": { + "parent_map": "MAP_GRANITE_CAVE_B2F", + "locations": [ + "ITEM_GRANITE_CAVE_B2F_RARE_CANDY", + "HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6" + ] + }, + "REGION_GRANITE_CAVE_B2F/LOWER": { + "parent_map": "MAP_GRANITE_CAVE_B2F", + "locations": [ + "HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2", + "MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3" + ] + }, + "REGION_GRANITE_CAVE_STEVENS_ROOM/MAIN": { + "parent_map": "MAP_GRANITE_CAVE_STEVENS_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_GRANITE_CAVE_STEVENS_ROOM/LETTER_DELIVERED" + ], + "warps": [ + "MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3" + ] + }, + "REGION_GRANITE_CAVE_STEVENS_ROOM/LETTER_DELIVERED": { + "parent_map": "MAP_GRANITE_CAVE_STEVENS_ROOM", + "locations": [ + "NPC_GIFT_RECEIVED_TM47" + ], + "events": [ + "EVENT_DELIVER_LETTER" + ], + "exits": [], + "warps": [] + }, + "REGION_TRAINER_HILL_ENTRANCE/MAIN": { + "parent_map": "MAP_TRAINER_HILL_ENTRANCE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4", + "MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0" + ] + }, + "REGION_TRAINER_HILL_1F/MAIN": { + "parent_map": "MAP_TRAINER_HILL_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2", + "MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0" + ] + }, + "REGION_TRAINER_HILL_2F/MAIN": { + "parent_map": "MAP_TRAINER_HILL_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1", + "MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0" + ] + }, + "REGION_TRAINER_HILL_3F/MAIN": { + "parent_map": "MAP_TRAINER_HILL_3F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1", + "MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0" + ] + }, + "REGION_TRAINER_HILL_4F/MAIN": { + "parent_map": "MAP_TRAINER_HILL_4F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1", + "MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0" + ] + }, + "REGION_TRAINER_HILL_ROOF/MAIN": { + "parent_map": "MAP_TRAINER_HILL_ROOF", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1", + "MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1" + ] + }, + "REGION_TRAINER_HILL_ELEVATOR/MAIN": { + "parent_map": "MAP_TRAINER_HILL_ELEVATOR", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1" + ] + }, + "REGION_FIERY_PATH/MAIN": { + "parent_map": "MAP_FIERY_PATH", + "locations": [], + "events": [], + "exits": [ + "REGION_FIERY_PATH/BEHIND_BOULDER" + ], + "warps": [ + "MAP_FIERY_PATH:0/MAP_ROUTE112:4", + "MAP_FIERY_PATH:1/MAP_ROUTE112:5" + ] + }, + "REGION_FIERY_PATH/BEHIND_BOULDER": { + "parent_map": "MAP_FIERY_PATH", + "locations": [ + "ITEM_FIERY_PATH_TM06", + "ITEM_FIERY_PATH_FIRE_STONE" + ], + "events": [], + "exits": [ + "REGION_FIERY_PATH/MAIN" + ], + "warps": [] + }, + "REGION_MAGMA_HIDEOUT_1F/MAIN": { + "parent_map": "MAP_MAGMA_HIDEOUT_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_MAGMA_HIDEOUT_1F/ENTRANCE" + ], + "warps": [ + "MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1" + ] + }, + "REGION_MAGMA_HIDEOUT_1F/CENTER_EXIT": { + "parent_map": "MAP_MAGMA_HIDEOUT_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_MAGMA_HIDEOUT_1F/MAIN" + ], + "warps": [ + "MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0" + ] + }, + "REGION_MAGMA_HIDEOUT_1F/LEDGE": { + "parent_map": "MAP_MAGMA_HIDEOUT_1F", + "locations": [ + "ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1" + ] + }, + "REGION_MAGMA_HIDEOUT_1F/ENTRANCE": { + "parent_map": "MAP_MAGMA_HIDEOUT_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_MAGMA_HIDEOUT_1F/MAIN" + ], + "warps": [ + "MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4" + ] + }, + "REGION_MAGMA_HIDEOUT_2F_1R/MAIN": { + "parent_map": "MAP_MAGMA_HIDEOUT_2F_1R", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0", + "MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1", + "MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2" + ] + }, + "REGION_MAGMA_HIDEOUT_2F_2R/MAIN": { + "parent_map": "MAP_MAGMA_HIDEOUT_2F_2R", + "locations": [ + "ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR", + "ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0", + "MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2" + ] + }, + "REGION_MAGMA_HIDEOUT_2F_3R/MAIN": { + "parent_map": "MAP_MAGMA_HIDEOUT_2F_3R", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3", + "MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0" + ] + }, + "REGION_MAGMA_HIDEOUT_3F_1R/MAIN": { + "parent_map": "MAP_MAGMA_HIDEOUT_3F_1R", + "locations": [ + "ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0", + "MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0", + "MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2" + ] + }, + "REGION_MAGMA_HIDEOUT_3F_2R/MAIN": { + "parent_map": "MAP_MAGMA_HIDEOUT_3F_2R", + "locations": [ + "ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1" + ] + }, + "REGION_MAGMA_HIDEOUT_3F_3R/MAIN": { + "parent_map": "MAP_MAGMA_HIDEOUT_3F_3R", + "locations": [ + "ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1", + "MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1" + ] + }, + "REGION_MAGMA_HIDEOUT_4F/MAIN": { + "parent_map": "MAP_MAGMA_HIDEOUT_4F", + "locations": [ + "ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE" + ], + "events": [ + "EVENT_RELEASE_GROUDON" + ], + "exits": [], + "warps": [ + "MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0", + "MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1" + ] + }, + "REGION_MIRAGE_TOWER_1F/MAIN": { + "parent_map": "MAP_MIRAGE_TOWER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3", + "MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1" + ] + }, + "REGION_MIRAGE_TOWER_2F/TOP": { + "parent_map": "MAP_MIRAGE_TOWER_2F", + "locations": [], + "events": [], + "exits": [ + "REGION_MIRAGE_TOWER_2F/BOTTOM", + "REGION_MIRAGE_TOWER_1F/MAIN" + ], + "warps": [ + "MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1" + ] + }, + "REGION_MIRAGE_TOWER_2F/BOTTOM": { + "parent_map": "MAP_MIRAGE_TOWER_2F", + "locations": [], + "events": [], + "exits": [ + "REGION_MIRAGE_TOWER_2F/TOP", + "REGION_MIRAGE_TOWER_1F/MAIN" + ], + "warps": [ + "MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0" + ] + }, + "REGION_MIRAGE_TOWER_3F/TOP": { + "parent_map": "MAP_MIRAGE_TOWER_3F", + "locations": [], + "events": [], + "exits": [ + "REGION_MIRAGE_TOWER_3F/BOTTOM" + ], + "warps": [ + "MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0" + ] + }, + "REGION_MIRAGE_TOWER_3F/BOTTOM": { + "parent_map": "MAP_MIRAGE_TOWER_3F", + "locations": [], + "events": [], + "exits": [ + "REGION_MIRAGE_TOWER_3F/TOP", + "REGION_MIRAGE_TOWER_2F/TOP" + ], + "warps": [ + "MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0" + ] + }, + "REGION_MIRAGE_TOWER_4F/MAIN": { + "parent_map": "MAP_MIRAGE_TOWER_4F", + "locations": [], + "events": [], + "exits": [ + "REGION_MIRAGE_TOWER_4F/FOSSIL_PLATFORM" + ], + "warps": [ + "MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1" + ] + }, + "REGION_MIRAGE_TOWER_4F/FOSSIL_PLATFORM": { + "parent_map": "MAP_MIRAGE_TOWER_4F", + "locations": [], + "events": [], + "exits": [], + "warps": [] + }, + "REGION_DESERT_RUINS/MAIN": { + "parent_map": "MAP_DESERT_RUINS", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_DESERT_RUINS:0/MAP_ROUTE111:1", + "MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2", + "MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1" + ] + }, + "REGION_METEOR_FALLS_1F_1R/MAIN": { + "parent_map": "MAP_METEOR_FALLS_1F_1R", + "locations": [ + "ITEM_METEOR_FALLS_1F_1R_MOON_STONE", + "ITEM_METEOR_FALLS_1F_1R_FULL_HEAL" + ], + "events": [ + "EVENT_MAGMA_STEALS_METEORITE" + ], + "exits": [ + "REGION_METEOR_FALLS_1F_1R/ABOVE_WATERFALL" + ], + "warps": [ + "MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0", + "MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0" + ] + }, + "REGION_METEOR_FALLS_1F_1R/ABOVE_WATERFALL": { + "parent_map": "MAP_METEOR_FALLS_1F_1R", + "locations": [], + "events": [], + "exits": [ + "REGION_METEOR_FALLS_1F_1R/MAIN" + ], + "warps": [ + "MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0" + ] + }, + "REGION_METEOR_FALLS_1F_1R/TOP": { + "parent_map": "MAP_METEOR_FALLS_1F_1R", + "locations": [ + "ITEM_METEOR_FALLS_1F_1R_TM23" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4", + "MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0" + ] + }, + "REGION_METEOR_FALLS_1F_1R/BOTTOM": { + "parent_map": "MAP_METEOR_FALLS_1F_1R", + "locations": [ + "ITEM_METEOR_FALLS_1F_1R_PP_UP" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5" + ] + }, + "REGION_METEOR_FALLS_1F_2R/TOP": { + "parent_map": "MAP_METEOR_FALLS_1F_2R", + "locations": [], + "events": [], + "exits": [ + "REGION_METEOR_FALLS_1F_2R/LEFT_SPLIT", + "REGION_METEOR_FALLS_1F_2R/RIGHT_SPLIT" + ], + "warps": [ + "MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0" + ] + }, + "REGION_METEOR_FALLS_1F_2R/LEFT_SPLIT": { + "parent_map": "MAP_METEOR_FALLS_1F_2R", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1" + ] + }, + "REGION_METEOR_FALLS_1F_2R/RIGHT_SPLIT": { + "parent_map": "MAP_METEOR_FALLS_1F_2R", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2", + "MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2" + ] + }, + "REGION_METEOR_FALLS_B1F_1R/UPPER": { + "parent_map": "MAP_METEOR_FALLS_B1F_1R", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1", + "MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3", + "MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3" + ] + }, + "REGION_METEOR_FALLS_B1F_1R/HIGHEST_LADDER": { + "parent_map": "MAP_METEOR_FALLS_B1F_1R", + "locations": [], + "events": [], + "exits": [ + "REGION_METEOR_FALLS_B1F_1R/WATER" + ], + "warps": [ + "MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2" + ] + }, + "REGION_METEOR_FALLS_B1F_1R/NORTH_SHORE": { + "parent_map": "MAP_METEOR_FALLS_B1F_1R", + "locations": [], + "events": [], + "exits": [ + "REGION_METEOR_FALLS_B1F_1R/WATER" + ], + "warps": [ + "MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0" + ] + }, + "REGION_METEOR_FALLS_B1F_1R/SOUTH_SHORE": { + "parent_map": "MAP_METEOR_FALLS_B1F_1R", + "locations": [], + "events": [], + "exits": [ + "REGION_METEOR_FALLS_B1F_1R/WATER" + ], + "warps": [ + "MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4" + ] + }, + "REGION_METEOR_FALLS_B1F_1R/WATER": { + "parent_map": "MAP_METEOR_FALLS_B1F_1R", + "locations": [], + "events": [], + "exits": [ + "REGION_METEOR_FALLS_B1F_1R/SOUTH_SHORE", + "REGION_METEOR_FALLS_B1F_1R/NORTH_SHORE", + "REGION_METEOR_FALLS_B1F_1R/HIGHEST_LADDER" + ], + "warps": [] + }, + "REGION_METEOR_FALLS_B1F_2R/ENTRANCE": { + "parent_map": "MAP_METEOR_FALLS_B1F_2R", + "locations": [], + "events": [], + "exits": [ + "REGION_METEOR_FALLS_B1F_2R/WATER" + ], + "warps": [ + "MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3" + ] + }, + "REGION_METEOR_FALLS_B1F_2R/WATER": { + "parent_map": "MAP_METEOR_FALLS_B1F_2R", + "locations": [ + "ITEM_METEOR_FALLS_B1F_2R_TM02" + ], + "events": [], + "exits": [ + "REGION_METEOR_FALLS_B1F_2R/ENTRANCE" + ], + "warps": [] + }, + "REGION_METEOR_FALLS_STEVENS_CAVE/MAIN": { + "parent_map": "MAP_METEOR_FALLS_STEVENS_CAVE", + "locations": [], + "events": [ + "EVENT_DEFEAT_STEVEN" + ], + "exits": [], + "warps": [ + "MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5" + ] + }, + "REGION_ALTERING_CAVE/MAIN": { + "parent_map": "MAP_ALTERING_CAVE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ALTERING_CAVE:0/MAP_ROUTE103:0" + ] + }, + "REGION_ISLAND_CAVE/MAIN": { + "parent_map": "MAP_ISLAND_CAVE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ISLAND_CAVE:0/MAP_ROUTE105:0", + "MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2", + "MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1" + ] + }, + "REGION_ABANDONED_SHIP_DECK/ENTRANCE": { + "parent_map": "MAP_ABANDONED_SHIP_DECK", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0", + "MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1" + ] + }, + "REGION_ABANDONED_SHIP_DECK/UPPER": { + "parent_map": "MAP_ABANDONED_SHIP_DECK", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2", + "MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0" + ] + }, + "REGION_ABANDONED_SHIP_CAPTAINS_OFFICE/MAIN": { + "parent_map": "MAP_ABANDONED_SHIP_CAPTAINS_OFFICE", + "locations": [ + "ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4" + ] + }, + "REGION_ABANDONED_SHIP_CORRIDORS_1F/WEST": { + "parent_map": "MAP_ABANDONED_SHIP_CORRIDORS_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3", + "MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0", + "MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6", + "MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2" + ] + }, + "REGION_ABANDONED_SHIP_CORRIDORS_1F/EAST": { + "parent_map": "MAP_ABANDONED_SHIP_CORRIDORS_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2", + "MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0", + "MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3", + "MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2", + "MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4", + "MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7" + ] + }, + "REGION_ABANDONED_SHIP_ROOMS_1F/MAIN": { + "parent_map": "MAP_ABANDONED_SHIP_ROOMS_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4", + "MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5", + "MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7" + ] + }, + "REGION_ABANDONED_SHIP_ROOMS_1F/NORTH_WEST": { + "parent_map": "MAP_ABANDONED_SHIP_ROOMS_1F", + "locations": [ + "ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6" + ] + }, + "REGION_ABANDONED_SHIP_ROOMS2_1F/MAIN": { + "parent_map": "MAP_ABANDONED_SHIP_ROOMS2_1F", + "locations": [ + "ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8", + "MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11" + ] + }, + "REGION_ABANDONED_SHIP_CORRIDORS_B1F/MAIN": { + "parent_map": "MAP_ABANDONED_SHIP_CORRIDORS_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2", + "MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0", + "MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0", + "MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1", + "MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2", + "MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0", + "MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10", + "MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9" + ] + }, + "REGION_ABANDONED_SHIP_ROOMS_B1F/LEFT": { + "parent_map": "MAP_ABANDONED_SHIP_ROOMS_B1F", + "locations": [ + "ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2" + ] + }, + "REGION_ABANDONED_SHIP_ROOMS_B1F/CENTER": { + "parent_map": "MAP_ABANDONED_SHIP_ROOMS_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_ABANDONED_SHIP_UNDERWATER1/MAIN" + ], + "warps": [ + "MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3" + ] + }, + "REGION_ABANDONED_SHIP_ROOMS_B1F/RIGHT": { + "parent_map": "MAP_ABANDONED_SHIP_ROOMS_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4" + ] + }, + "REGION_ABANDONED_SHIP_ROOMS2_B1F/MAIN": { + "parent_map": "MAP_ABANDONED_SHIP_ROOMS2_B1F", + "locations": [ + "ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1", + "MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0" + ] + }, + "REGION_ABANDONED_SHIP_ROOM_B1F/MAIN": { + "parent_map": "MAP_ABANDONED_SHIP_ROOM_B1F", + "locations": [ + "ITEM_ABANDONED_SHIP_ROOMS_B1F_TM13" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5" + ] + }, + "REGION_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS/MAIN": { + "parent_map": "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS", + "locations": [], + "events": [], + "exits": [ + "REGION_ABANDONED_SHIP_UNDERWATER2/MAIN" + ], + "warps": [ + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0", + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6", + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2", + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7", + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4", + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8" + ] + }, + "REGION_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS/TOP_LEFT": { + "parent_map": "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS", + "locations": [ + "HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3" + ] + }, + "REGION_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS/TOP_CENTER_DOORWAY": { + "parent_map": "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4" + ] + }, + "REGION_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS/TOP_RIGHT": { + "parent_map": "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS", + "locations": [ + "ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL", + "HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5" + ] + }, + "REGION_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS/BOTTOM_LEFT": { + "parent_map": "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS", + "locations": [ + "ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM18", + "HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0" + ] + }, + "REGION_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS/BOTTOM_CENTER": { + "parent_map": "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS", + "locations": [ + "ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_4_SCANNER" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1" + ] + }, + "REGION_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS/BOTTOM_RIGHT": { + "parent_map": "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS", + "locations": [ + "ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE", + "HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2" + ] + }, + "REGION_ABANDONED_SHIP_UNDERWATER1/MAIN": { + "parent_map": "MAP_ABANDONED_SHIP_UNDERWATER1", + "locations": [], + "events": [], + "exits": [ + "REGION_ABANDONED_SHIP_ROOMS_B1F/CENTER" + ], + "warps": [ + "MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0" + ] + }, + "REGION_ABANDONED_SHIP_UNDERWATER2/MAIN": { + "parent_map": "MAP_ABANDONED_SHIP_UNDERWATER2", + "locations": [], + "events": [], + "exits": [ + "REGION_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS/MAIN" + ], + "warps": [ + "MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0" + ] + }, + "REGION_NEW_MAUVILLE_ENTRANCE/MAIN": { + "parent_map": "MAP_NEW_MAUVILLE_ENTRANCE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0", + "MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0" + ] + }, + "REGION_NEW_MAUVILLE_INSIDE/MAIN": { + "parent_map": "MAP_NEW_MAUVILLE_INSIDE", + "locations": [ + "ITEM_NEW_MAUVILLE_ULTRA_BALL", + "ITEM_NEW_MAUVILLE_ESCAPE_ROPE", + "ITEM_NEW_MAUVILLE_THUNDER_STONE", + "ITEM_NEW_MAUVILLE_FULL_HEAL", + "ITEM_NEW_MAUVILLE_PARALYZE_HEAL" + ], + "events": [ + "EVENT_TURN_OFF_GENERATOR" + ], + "exits": [], + "warps": [ + "MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1" + ] + }, + "REGION_SCORCHED_SLAB/MAIN": { + "parent_map": "MAP_SCORCHED_SLAB", + "locations": [ + "ITEM_SCORCHED_SLAB_TM11" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1" + ] + }, + "REGION_ANCIENT_TOMB/MAIN": { + "parent_map": "MAP_ANCIENT_TOMB", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0", + "MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2", + "MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1" + ] + }, + "REGION_MT_PYRE_1F/MAIN": { + "parent_map": "MAP_MT_PYRE_1F", + "locations": [ + "NPC_GIFT_RECEIVED_CLEANSE_TAG" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0", + "MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0", + "MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0", + "MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4" + ] + }, + "REGION_MT_PYRE_2F/MAIN": { + "parent_map": "MAP_MT_PYRE_2F", + "locations": [ + "ITEM_MT_PYRE_2F_ULTRA_BALL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4", + "MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0", + "MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4", + "MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5", + "MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5" + ] + }, + "REGION_MT_PYRE_3F/MAIN": { + "parent_map": "MAP_MT_PYRE_3F", + "locations": [ + "ITEM_MT_PYRE_3F_SUPER_REPEL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1", + "MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1", + "MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4", + "MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5", + "MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2", + "MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3" + ] + }, + "REGION_MT_PYRE_4F/MAIN": { + "parent_map": "MAP_MT_PYRE_4F", + "locations": [ + "ITEM_MT_PYRE_4F_SEA_INCENSE" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1", + "MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1", + "MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3", + "MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4", + "MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2", + "MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3" + ] + }, + "REGION_MT_PYRE_5F/MAIN": { + "parent_map": "MAP_MT_PYRE_5F", + "locations": [ + "ITEM_MT_PYRE_5F_LAX_INCENSE" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0", + "MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0", + "MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1", + "MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2", + "MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3" + ] + }, + "REGION_MT_PYRE_6F/MAIN": { + "parent_map": "MAP_MT_PYRE_6F", + "locations": [ + "ITEM_MT_PYRE_6F_TM30" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0", + "MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2" + ] + }, + "REGION_MT_PYRE_EXTERIOR/MAIN": { + "parent_map": "MAP_MT_PYRE_EXTERIOR", + "locations": [ + "ITEM_MT_PYRE_EXTERIOR_MAX_POTION", + "ITEM_MT_PYRE_EXTERIOR_TM48", + "HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL", + "HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1", + "MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1" + ] + }, + "REGION_MT_PYRE_SUMMIT/MAIN": { + "parent_map": "MAP_MT_PYRE_SUMMIT", + "locations": [ + "HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC", + "HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY", + "NPC_GIFT_RECEIVED_MAGMA_EMBLEM" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1" + ] + }, + "REGION_AQUA_HIDEOUT_1F/MAIN": { + "parent_map": "MAP_AQUA_HIDEOUT_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_AQUA_HIDEOUT_1F/WATER" + ], + "warps": [ + "MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0" + ] + }, + "REGION_AQUA_HIDEOUT_1F/WATER": { + "parent_map": "MAP_AQUA_HIDEOUT_1F", + "locations": [], + "events": [], + "exits": [ + "REGION_AQUA_HIDEOUT_1F/MAIN" + ], + "warps": [ + "MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/WEST_BOTTOM": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5", + "MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12", + "MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/WEST_TOP_LEFT": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1", + "MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/WEST_TOP_CENTER": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0", + "MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/WEST_TOP_RIGHT": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2", + "MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7", + "MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/WEST_CENTER_RIGHT": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [ + "ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/WEST_CENTER": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [ + "ITEM_AQUA_HIDEOUT_B1F_NUGGET", + "ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/EAST_TOP": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9", + "MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18", + "MAP_AQUA_HIDEOUT_B1F:14/MAP_AQUA_HIDEOUT_B1F:12!", + "MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_1_RIGHT": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_1_CENTER" + ], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_1_CENTER": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_1_LEFT", + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_1_RIGHT" + ], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_1_LEFT": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_1_CENTER" + ], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_2_RIGHT": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_2_CENTER" + ], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:21/MAP_AQUA_HIDEOUT_B1F:12!" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_2_CENTER": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_2_LEFT", + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_2_RIGHT" + ], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_2_LEFT": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_AQUA_HIDEOUT_B1F/EAST_ROW_2_CENTER" + ], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24" + ] + }, + "REGION_AQUA_HIDEOUT_B1F/EAST_BOTTOM": { + "parent_map": "MAP_AQUA_HIDEOUT_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11", + "MAP_AQUA_HIDEOUT_B1F:23/MAP_AQUA_HIDEOUT_B1F:17!", + "MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19" + ] + }, + "REGION_AQUA_HIDEOUT_B2F/TOP_LEFT": { + "parent_map": "MAP_AQUA_HIDEOUT_B2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3", + "MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3" + ] + }, + "REGION_AQUA_HIDEOUT_B2F/TOP_CENTER": { + "parent_map": "MAP_AQUA_HIDEOUT_B2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2", + "MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8" + ] + }, + "REGION_AQUA_HIDEOUT_B2F/TOP_RIGHT": { + "parent_map": "MAP_AQUA_HIDEOUT_B2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1", + "MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5", + "MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7" + ] + }, + "REGION_AQUA_HIDEOUT_B2F/BOTTOM_LEFT": { + "parent_map": "MAP_AQUA_HIDEOUT_B2F", + "locations": [ + "ITEM_AQUA_HIDEOUT_B2F_NEST_BALL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6" + ] + }, + "REGION_AQUA_HIDEOUT_B2F/BOTTOM_RIGHT": { + "parent_map": "MAP_AQUA_HIDEOUT_B2F", + "locations": [], + "events": [ + "EVENT_CLEAR_AQUA_HIDEOUT" + ], + "exits": [], + "warps": [ + "MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4", + "MAP_AQUA_HIDEOUT_B2F:9/MAP_AQUA_HIDEOUT_B1F:4!" + ] + }, + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/SOUTH": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/LOW_TIDE_LOWER", + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER" + ], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0" + ] + }, + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/NORTH_WEST_CORNER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER" + ], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6" + ] + }, + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/NORTH_EAST_CORNER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM", + "locations": [ + "ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL" + ], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER" + ], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7" + ] + }, + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/SOUTH", + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/NORTH_WEST_CORNER" + ], + "warps": [] + }, + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/LOW_TIDE_LOWER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_ENTRANCE_ROOM/SOUTH" + ], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0" + ] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_EAST_CORNER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND" + ], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3" + ] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_EAST_CORNER", + "REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_EAST_WATER", + "REGION_SHOAL_CAVE_INNER_ROOM/EAST_WATER", + "REGION_SHOAL_CAVE_INNER_ROOM/NORTH_WEST_WATER" + ], + "warps": [] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/LOW_TIDE_EAST_MIDDLE_GROUND": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_INNER_ROOM/LOW_TIDE_SOUTH_EAST_LOWER", + "REGION_SHOAL_CAVE_INNER_ROOM/LOW_TIDE_EAST_LOWER" + ], + "warps": [] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_WEST_CORNER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_INNER_ROOM/NORTH_WEST_WATER" + ], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2" + ] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/BRIDGES": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1", + "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0" + ] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/RARE_CANDY_PLATFORM": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [ + "ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY" + ], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_EAST_WATER" + ], + "warps": [] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_EAST_WATER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND", + "REGION_SHOAL_CAVE_INNER_ROOM/RARE_CANDY_PLATFORM" + ], + "warps": [] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/EAST_WATER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND" + ], + "warps": [] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/NORTH_WEST_WATER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND", + "REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_WEST_CORNER" + ], + "warps": [] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/LOW_TIDE_SOUTH_EAST_LOWER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_INNER_ROOM/LOW_TIDE_EAST_MIDDLE_GROUND" + ], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1", + "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2" + ] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/LOW_TIDE_EAST_LOWER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_INNER_ROOM/LOW_TIDE_EAST_MIDDLE_GROUND" + ], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0" + ] + }, + "REGION_SHOAL_CAVE_INNER_ROOM/LOW_TIDE_NORTH_WEST_LOWER": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1" + ] + }, + "REGION_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM/MAIN": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM", + "locations": [ + "ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1", + "MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2" + ] + }, + "REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/NORTH_WEST": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM", + "locations": [ + "NPC_GIFT_RECEIVED_FOCUS_BAND" + ], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/EAST", + "REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/SOUTH" + ], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3", + "MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4" + ] + }, + "REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/SOUTH": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5" + ] + }, + "REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/EAST": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/NORTH_WEST" + ], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0" + ] + }, + "REGION_SHOAL_CAVE_LOW_TIDE_ICE_ROOM/MAIN": { + "parent_map": "MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM", + "locations": [ + "ITEM_SHOAL_CAVE_ICE_ROOM_TM07", + "ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3" + ] + }, + "REGION_UNDERWATER_SEAFLOOR_CAVERN/MAIN": { + "parent_map": "MAP_UNDERWATER_SEAFLOOR_CAVERN", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ENTRANCE/MAIN" + ], + "warps": [ + "MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0" + ] + }, + "REGION_SEAFLOOR_CAVERN_ENTRANCE/MAIN": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ENTRANCE", + "locations": [], + "events": [], + "exits": [ + "REGION_UNDERWATER_SEAFLOOR_CAVERN/MAIN" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ENTRANCE:0/MAP_UNDERWATER_ROUTE128:0!", + "MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM1/NORTH": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM1", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM1/SOUTH" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0", + "MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM1/SOUTH": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM1", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM1/NORTH" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM2", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST", + "REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM2", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST", + "REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_EAST", + "REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM2", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_EAST": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM2", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM3/MAIN": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM3", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1", + "MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1", + "MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM4/NORTH_WEST": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM4", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM4/EAST" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM4/EAST": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM4", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM4/SOUTH" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2", + "MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM4/SOUTH": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM4", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM4:3/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM5", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM5/EAST", + "REGION_SEAFLOOR_CAVERN_ROOM5/SOUTH_WEST" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM5/EAST": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM5", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM5/SOUTH_WEST": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM5", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM6/NORTH_WEST": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM6", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM6/CAVE_ON_WATER" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM6/CAVE_ON_WATER": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM6", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM6:2/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM6/SOUTH": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM6", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM6/NORTH_WEST", + "REGION_SEAFLOOR_CAVERN_ROOM6/CAVE_ON_WATER" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM7/NORTH": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM7", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM7/SOUTH" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM7/SOUTH": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM7", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM7/NORTH" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM8/NORTH": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM8", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM8/SOUTH" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM8/SOUTH": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM8", + "locations": [], + "events": [], + "exits": [ + "REGION_SEAFLOOR_CAVERN_ROOM8/NORTH" + ], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0" + ] + }, + "REGION_SEAFLOOR_CAVERN_ROOM9/MAIN": { + "parent_map": "MAP_SEAFLOOR_CAVERN_ROOM9", + "locations": [ + "ITEM_SEAFLOOR_CAVERN_ROOM_9_TM26" + ], + "events": [ + "EVENT_RELEASE_KYOGRE" + ], + "exits": [], + "warps": [ + "MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0" + ] + }, + "REGION_CAVE_OF_ORIGIN_ENTRANCE/MAIN": { + "parent_map": "MAP_CAVE_OF_ORIGIN_ENTRANCE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3", + "MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0" + ] + }, + "REGION_CAVE_OF_ORIGIN_1F/MAIN": { + "parent_map": "MAP_CAVE_OF_ORIGIN_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1", + "MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0" + ] + }, + "REGION_CAVE_OF_ORIGIN_B1F/MAIN": { + "parent_map": "MAP_CAVE_OF_ORIGIN_B1F", + "locations": [], + "events": [ + "EVENT_WALLACE_GOES_TO_SKY_PILLAR" + ], + "exits": [], + "warps": [ + "MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1" + ] + }, + "REGION_SKY_PILLAR_ENTRANCE/MAIN": { + "parent_map": "MAP_SKY_PILLAR_ENTRANCE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0", + "MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0" + ] + }, + "REGION_SKY_PILLAR_OUTSIDE/MAIN": { + "parent_map": "MAP_SKY_PILLAR_OUTSIDE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1", + "MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0" + ] + }, + "REGION_SKY_PILLAR_1F/MAIN": { + "parent_map": "MAP_SKY_PILLAR_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1", + "MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0" + ] + }, + "REGION_SKY_PILLAR_2F/LEFT": { + "parent_map": "MAP_SKY_PILLAR_2F", + "locations": [], + "events": [], + "exits": [ + "REGION_SKY_PILLAR_2F/RIGHT", + "REGION_SKY_PILLAR_1F/MAIN" + ], + "warps": [ + "MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0" + ] + }, + "REGION_SKY_PILLAR_2F/RIGHT": { + "parent_map": "MAP_SKY_PILLAR_2F", + "locations": [], + "events": [], + "exits": [ + "REGION_SKY_PILLAR_2F/LEFT", + "REGION_SKY_PILLAR_1F/MAIN" + ], + "warps": [ + "MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2" + ] + }, + "REGION_SKY_PILLAR_3F/MAIN": { + "parent_map": "MAP_SKY_PILLAR_3F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1", + "MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0" + ] + }, + "REGION_SKY_PILLAR_3F/TOP_CENTER": { + "parent_map": "MAP_SKY_PILLAR_3F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1" + ] + }, + "REGION_SKY_PILLAR_4F/MAIN": { + "parent_map": "MAP_SKY_PILLAR_4F", + "locations": [], + "events": [], + "exits": [ + "REGION_SKY_PILLAR_4F/ABOVE_3F_TOP_CENTER", + "REGION_SKY_PILLAR_3F/MAIN" + ], + "warps": [ + "MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1" + ] + }, + "REGION_SKY_PILLAR_4F/ABOVE_3F_TOP_CENTER": { + "parent_map": "MAP_SKY_PILLAR_4F", + "locations": [], + "events": [], + "exits": [ + "REGION_SKY_PILLAR_3F/TOP_CENTER" + ], + "warps": [] + }, + "REGION_SKY_PILLAR_4F/TOP_LEFT": { + "parent_map": "MAP_SKY_PILLAR_4F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2", + "MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0" + ] + }, + "REGION_SKY_PILLAR_5F/MAIN": { + "parent_map": "MAP_SKY_PILLAR_5F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2", + "MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0" + ] + }, + "REGION_SKY_PILLAR_TOP/MAIN": { + "parent_map": "MAP_SKY_PILLAR_TOP", + "locations": [], + "events": [ + "EVENT_WAKE_RAYQUAZA" + ], + "exits": [], + "warps": [ + "MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1" + ] + }, + "REGION_UNDERWATER_SEALED_CHAMBER/MAIN": { + "parent_map": "MAP_UNDERWATER_SEALED_CHAMBER", + "locations": [], + "events": [], + "exits": [ + "REGION_SEALED_CHAMBER_OUTER_ROOM/MAIN" + ], + "warps": [ + "MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0" + ] + }, + "REGION_SEALED_CHAMBER_OUTER_ROOM/MAIN": { + "parent_map": "MAP_SEALED_CHAMBER_OUTER_ROOM", + "locations": [], + "events": [], + "exits": [ + "REGION_UNDERWATER_SEALED_CHAMBER/MAIN" + ], + "warps": [ + "MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0" + ] + }, + "REGION_SEALED_CHAMBER_INNER_ROOM/MAIN": { + "parent_map": "MAP_SEALED_CHAMBER_INNER_ROOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0" + ] + }, + "REGION_VICTORY_ROAD_1F/NORTH_EAST": { + "parent_map": "MAP_VICTORY_ROAD_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3", + "MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5" + ] + }, + "REGION_VICTORY_ROAD_1F/SOUTH_WEST": { + "parent_map": "MAP_VICTORY_ROAD_1F", + "locations": [ + "ITEM_VICTORY_ROAD_1F_MAX_ELIXIR" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2", + "MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4" + ] + }, + "REGION_VICTORY_ROAD_1F/SOUTH_EAST": { + "parent_map": "MAP_VICTORY_ROAD_1F", + "locations": [ + "ITEM_VICTORY_ROAD_1F_PP_UP", + "HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2" + ] + }, + "REGION_VICTORY_ROAD_B1F/NORTH_EAST": { + "parent_map": "MAP_VICTORY_ROAD_B1F", + "locations": [ + "ITEM_VICTORY_ROAD_B1F_TM29" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1" + ] + }, + "REGION_VICTORY_ROAD_B1F/SOUTH_WEST_MAIN": { + "parent_map": "MAP_VICTORY_ROAD_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B1F/SOUTH_WEST_LADDER_UP" + ], + "warps": [ + "MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2", + "MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3" + ] + }, + "REGION_VICTORY_ROAD_B1F/SOUTH_WEST_LADDER_UP": { + "parent_map": "MAP_VICTORY_ROAD_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B1F/SOUTH_WEST_MAIN" + ], + "warps": [ + "MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2" + ] + }, + "REGION_VICTORY_ROAD_B1F/MAIN_UPPER": { + "parent_map": "MAP_VICTORY_ROAD_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST" + ], + "warps": [ + "MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3" + ] + }, + "REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST": { + "parent_map": "MAP_VICTORY_ROAD_B1F", + "locations": [ + "ITEM_VICTORY_ROAD_B1F_FULL_RESTORE" + ], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B1F/MAIN_LOWER_WEST" + ], + "warps": [ + "MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0" + ] + }, + "REGION_VICTORY_ROAD_B1F/MAIN_LOWER_WEST": { + "parent_map": "MAP_VICTORY_ROAD_B1F", + "locations": [], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B1F/MAIN_UPPER", + "REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST" + ], + "warps": [ + "MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4" + ] + }, + "REGION_VICTORY_ROAD_B2F/LOWER_WEST": { + "parent_map": "MAP_VICTORY_ROAD_B2F", + "locations": [], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER" + ], + "warps": [ + "MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6" + ] + }, + "REGION_VICTORY_ROAD_B2F/LOWER_WEST_ISLAND": { + "parent_map": "MAP_VICTORY_ROAD_B2F", + "locations": [], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER" + ], + "warps": [ + "MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1" + ] + }, + "REGION_VICTORY_ROAD_B2F/LOWER_EAST": { + "parent_map": "MAP_VICTORY_ROAD_B2F", + "locations": [], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER" + ], + "warps": [ + "MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0" + ] + }, + "REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER": { + "parent_map": "MAP_VICTORY_ROAD_B2F", + "locations": [], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B2F/UPPER_WATER", + "REGION_VICTORY_ROAD_B2F/LOWER_WEST", + "REGION_VICTORY_ROAD_B2F/LOWER_WEST_ISLAND" + ], + "warps": [] + }, + "REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER": { + "parent_map": "MAP_VICTORY_ROAD_B2F", + "locations": [], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B2F/UPPER_WATER", + "REGION_VICTORY_ROAD_B2F/UPPER", + "REGION_VICTORY_ROAD_B2F/LOWER_EAST" + ], + "warps": [] + }, + "REGION_VICTORY_ROAD_B2F/UPPER": { + "parent_map": "MAP_VICTORY_ROAD_B2F", + "locations": [ + "HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL" + ], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER", + "REGION_VICTORY_ROAD_B2F/LOWER_EAST", + "REGION_VICTORY_ROAD_B2F/UPPER_WATER" + ], + "warps": [ + "MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3" + ] + }, + "REGION_VICTORY_ROAD_B2F/UPPER_WATER": { + "parent_map": "MAP_VICTORY_ROAD_B2F", + "locations": [ + "ITEM_VICTORY_ROAD_B2F_FULL_HEAL", + "HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR" + ], + "events": [], + "exits": [ + "REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER", + "REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER", + "REGION_VICTORY_ROAD_B2F/UPPER" + ], + "warps": [] + } +} diff --git a/worlds/pokemon_emerald/data/regions/routes.json b/worlds/pokemon_emerald/data/regions/routes.json new file mode 100644 index 000000000000..029aa85c3cdc --- /dev/null +++ b/worlds/pokemon_emerald/data/regions/routes.json @@ -0,0 +1,1881 @@ +{ + "REGION_ROUTE101/MAIN": { + "parent_map": "MAP_ROUTE101", + "locations": [], + "events": [], + "exits": [ + "REGION_LITTLEROOT_TOWN/MAIN", + "REGION_OLDALE_TOWN/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE102/MAIN": { + "parent_map": "MAP_ROUTE102", + "locations": [ + "ITEM_ROUTE_102_POTION" + ], + "events": [], + "exits": [ + "REGION_OLDALE_TOWN/MAIN", + "REGION_PETALBURG_CITY/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE103/WEST": { + "parent_map": "MAP_ROUTE103", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE103/WATER", + "REGION_OLDALE_TOWN/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE103/WATER": { + "parent_map": "MAP_ROUTE103", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE103/WEST", + "REGION_ROUTE103/EAST" + ], + "warps": [] + }, + "REGION_ROUTE103/EAST": { + "parent_map": "MAP_ROUTE103", + "locations": [ + "ITEM_ROUTE_103_GUARD_SPEC", + "ITEM_ROUTE_103_PP_UP" + ], + "events": [], + "exits": [ + "REGION_ROUTE103/WATER", + "REGION_ROUTE110/MAIN" + ], + "warps": [ + "MAP_ROUTE103:0/MAP_ALTERING_CAVE:0" + ] + }, + "REGION_ROUTE104/SOUTH": { + "parent_map": "MAP_ROUTE104", + "locations": [ + "HIDDEN_ITEM_ROUTE_104_POTION", + "HIDDEN_ITEM_ROUTE_104_HEART_SCALE", + "HIDDEN_ITEM_ROUTE_104_ANTIDOTE" + ], + "events": [], + "exits": [ + "REGION_PETALBURG_CITY/MAIN", + "REGION_ROUTE105/MAIN" + ], + "warps": [ + "MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0", + "MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3" + ] + }, + "REGION_ROUTE104/SOUTH_LEDGE": { + "parent_map": "MAP_ROUTE104", + "locations": [ + "ITEM_ROUTE_104_POKE_BALL" + ], + "events": [], + "exits": [ + "REGION_ROUTE104/SOUTH" + ], + "warps": [ + "MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5" + ] + }, + "REGION_ROUTE104/NORTH": { + "parent_map": "MAP_ROUTE104", + "locations": [ + "ITEM_ROUTE_104_PP_UP", + "ITEM_ROUTE_104_POTION", + "ITEM_ROUTE_104_X_ACCURACY", + "HIDDEN_ITEM_ROUTE_104_SUPER_POTION", + "HIDDEN_ITEM_ROUTE_104_POKE_BALL", + "NPC_GIFT_RECEIVED_TM09", + "NPC_GIFT_RECEIVED_WHITE_HERB", + "NPC_GIFT_RECEIVED_CHESTO_BERRY_ROUTE_104" + ], + "events": [], + "exits": [ + "REGION_RUSTBORO_CITY/MAIN" + ], + "warps": [ + "MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0", + "MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1" + ] + }, + "REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN": { + "parent_map": "MAP_ROUTE104_MR_BRINEYS_HOUSE", + "locations": [], + "events": [], + "exits": [ + "REGION_DEWFORD_TOWN/MAIN" + ], + "warps": [ + "MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0" + ] + }, + "REGION_ROUTE104_PRETTY_PETAL_FLOWER_SHOP/MAIN": { + "parent_map": "MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP", + "locations": [ + "NPC_GIFT_RECEIVED_WAILMER_PAIL" + ], + "events": [ + "EVENT_MEET_FLOWER_SHOP_OWNER" + ], + "exits": [], + "warps": [ + "MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1" + ] + }, + "REGION_ROUTE105/MAIN": { + "parent_map": "MAP_ROUTE105", + "locations": [ + "ITEM_ROUTE_105_IRON", + "HIDDEN_ITEM_ROUTE_105_HEART_SCALE", + "HIDDEN_ITEM_ROUTE_105_BIG_PEARL" + ], + "events": [], + "exits": [ + "REGION_ROUTE104/SOUTH", + "REGION_ROUTE106/SEA", + "REGION_UNDERWATER_ROUTE105/MAIN" + ], + "warps": [ + "MAP_ROUTE105:0/MAP_ISLAND_CAVE:0" + ] + }, + "REGION_UNDERWATER_ROUTE105/MAIN": { + "parent_map": "MAP_UNDERWATER_ROUTE105", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE105/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE106/WEST": { + "parent_map": "MAP_ROUTE106", + "locations": [ + "ITEM_ROUTE_106_PROTEIN" + ], + "events": [], + "exits": [ + "REGION_ROUTE106/SEA" + ], + "warps": [] + }, + "REGION_ROUTE106/SEA": { + "parent_map": "MAP_ROUTE106", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE105/MAIN", + "REGION_ROUTE106/EAST", + "REGION_ROUTE106/WEST" + ], + "warps": [] + }, + "REGION_ROUTE106/EAST": { + "parent_map": "MAP_ROUTE106", + "locations": [ + "HIDDEN_ITEM_ROUTE_106_POKE_BALL", + "HIDDEN_ITEM_ROUTE_106_STARDUST", + "HIDDEN_ITEM_ROUTE_106_HEART_SCALE" + ], + "events": [], + "exits": [ + "REGION_ROUTE106/SEA", + "REGION_DEWFORD_TOWN/MAIN" + ], + "warps": [ + "MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0" + ] + }, + "REGION_ROUTE107/MAIN": { + "parent_map": "MAP_ROUTE107", + "locations": [], + "events": [], + "exits": [ + "REGION_DEWFORD_TOWN/MAIN", + "REGION_ROUTE108/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE108/MAIN": { + "parent_map": "MAP_ROUTE108", + "locations": [ + "ITEM_ROUTE_108_STAR_PIECE", + "HIDDEN_ITEM_ROUTE_108_RARE_CANDY" + ], + "events": [], + "exits": [ + "REGION_ROUTE107/MAIN", + "REGION_ROUTE109/SEA" + ], + "warps": [ + "MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0" + ] + }, + "REGION_ROUTE109/SEA": { + "parent_map": "MAP_ROUTE109", + "locations": [ + "ITEM_ROUTE_109_PP_UP", + "HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3" + ], + "events": [], + "exits": [ + "REGION_ROUTE109/BEACH", + "REGION_ROUTE108/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE109/BEACH": { + "parent_map": "MAP_ROUTE109", + "locations": [ + "ITEM_ROUTE_109_POTION", + "HIDDEN_ITEM_ROUTE_109_REVIVE", + "HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1", + "HIDDEN_ITEM_ROUTE_109_GREAT_BALL", + "HIDDEN_ITEM_ROUTE_109_ETHER", + "HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2", + "NPC_GIFT_RECEIVED_SOFT_SAND" + ], + "events": [], + "exits": [ + "REGION_ROUTE109/SEA", + "REGION_SLATEPORT_CITY/MAIN", + "REGION_DEWFORD_TOWN/MAIN" + ], + "warps": [ + "MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0" + ] + }, + "REGION_ROUTE109_SEASHORE_HOUSE/MAIN": { + "parent_map": "MAP_ROUTE109_SEASHORE_HOUSE", + "locations": [ + "NPC_GIFT_RECEIVED_6_SODA_POP" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0" + ] + }, + "REGION_ROUTE110/MAIN": { + "parent_map": "MAP_ROUTE110", + "locations": [ + "ITEM_ROUTE_110_DIRE_HIT", + "ITEM_ROUTE_110_ELIXIR", + "HIDDEN_ITEM_ROUTE_110_REVIVE", + "HIDDEN_ITEM_ROUTE_110_GREAT_BALL", + "HIDDEN_ITEM_ROUTE_110_POKE_BALL", + "HIDDEN_ITEM_ROUTE_110_FULL_HEAL", + "NPC_GIFT_RECEIVED_ITEMFINDER" + ], + "events": [], + "exits": [ + "REGION_ROUTE110/SOUTH", + "REGION_ROUTE110/SOUTH_WATER", + "REGION_ROUTE110/NORTH_WATER", + "REGION_MAUVILLE_CITY/MAIN", + "REGION_ROUTE103/EAST" + ], + "warps": [ + "MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0", + "MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0" + ] + }, + "REGION_ROUTE110/SOUTH": { + "parent_map": "MAP_ROUTE110", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE110/MAIN", + "REGION_SLATEPORT_CITY/MAIN" + ], + "warps": [ + "MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0" + ] + }, + "REGION_ROUTE110/CYCLING_ROAD": { + "parent_map": "MAP_ROUTE110", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2", + "MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2" + ] + }, + "REGION_ROUTE110/SOUTH_WATER": { + "parent_map": "MAP_ROUTE110", + "locations": [ + "ITEM_ROUTE_110_RARE_CANDY" + ], + "events": [], + "exits": [ + "REGION_ROUTE110/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE110/NORTH_WATER": { + "parent_map": "MAP_ROUTE110", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE110/MAIN" + ], + "warps": [ + "MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0" + ] + }, + "REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN": { + "parent_map": "MAP_ROUTE110_TRICK_HOUSE_ENTRANCE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1", + "MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0" + ] + }, + "REGION_ROUTE110_TRICK_HOUSE_PUZZLE1/MAIN": { + "parent_map": "MAP_ROUTE110_TRICK_HOUSE_PUZZLE1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0" + ] + }, + "REGION_ROUTE110_TRICK_HOUSE_END/MAIN": { + "parent_map": "MAP_ROUTE110_TRICK_HOUSE_END", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0", + "MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2" + ] + }, + "REGION_ROUTE110_TRICK_HOUSE_CORRIDOR/MAIN": { + "parent_map": "MAP_ROUTE110_TRICK_HOUSE_CORRIDOR", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:2,3/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1" + ] + }, + "REGION_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE/WEST": { + "parent_map": "MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE/EAST" + ], + "warps": [ + "MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2" + ] + }, + "REGION_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE/EAST": { + "parent_map": "MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE/WEST" + ], + "warps": [ + "MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3" + ] + }, + "REGION_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE/WEST": { + "parent_map": "MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE/EAST" + ], + "warps": [ + "MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4" + ] + }, + "REGION_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE/EAST": { + "parent_map": "MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE/WEST" + ], + "warps": [ + "MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5" + ] + }, + "REGION_ROUTE111/MIDDLE": { + "parent_map": "MAP_ROUTE111", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE111/DESERT", + "REGION_ROUTE111/SOUTH", + "REGION_ROUTE112/SOUTH_EAST" + ], + "warps": [] + }, + "REGION_ROUTE111/SOUTH": { + "parent_map": "MAP_ROUTE111", + "locations": [ + "ITEM_ROUTE_111_ELIXIR" + ], + "events": [], + "exits": [ + "REGION_ROUTE111/SOUTH_POND", + "REGION_ROUTE111/MIDDLE", + "REGION_MAUVILLE_CITY/MAIN" + ], + "warps": [ + "MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0", + "MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0" + ] + }, + "REGION_ROUTE111/SOUTH_POND": { + "parent_map": "MAP_ROUTE111", + "locations": [ + "ITEM_ROUTE_111_HP_UP" + ], + "events": [], + "exits": [ + "REGION_ROUTE111/SOUTH" + ], + "warps": [] + }, + "REGION_ROUTE111/DESERT": { + "parent_map": "MAP_ROUTE111", + "locations": [ + "ITEM_ROUTE_111_TM37", + "ITEM_ROUTE_111_STARDUST", + "HIDDEN_ITEM_ROUTE_111_STARDUST", + "HIDDEN_ITEM_ROUTE_111_PROTEIN", + "HIDDEN_ITEM_ROUTE_111_RARE_CANDY" + ], + "events": [], + "exits": [ + "REGION_ROUTE111/NORTH", + "REGION_ROUTE111/MIDDLE" + ], + "warps": [ + "MAP_ROUTE111:1/MAP_DESERT_RUINS:0", + "MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0" + ] + }, + "REGION_ROUTE111/NORTH": { + "parent_map": "MAP_ROUTE111", + "locations": [ + "NPC_GIFT_RECEIVED_SECRET_POWER" + ], + "events": [], + "exits": [ + "REGION_ROUTE113/MAIN", + "REGION_ROUTE112/NORTH", + "REGION_ROUTE111/DESERT" + ], + "warps": [ + "MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0" + ] + }, + "REGION_ROUTE111_OLD_LADYS_REST_STOP/MAIN": { + "parent_map": "MAP_ROUTE111_OLD_LADYS_REST_STOP", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2" + ] + }, + "REGION_ROUTE111_WINSTRATE_FAMILYS_HOUSE/MAIN": { + "parent_map": "MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE", + "locations": [ + "NPC_GIFT_RECEIVED_MACHO_BRACE" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0" + ] + }, + "REGION_ROUTE112/SOUTH_EAST": { + "parent_map": "MAP_ROUTE112", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE112/CABLE_CAR_STATION_ENTRANCE", + "REGION_ROUTE111/MIDDLE" + ], + "warps": [ + "MAP_ROUTE112:4/MAP_FIERY_PATH:0" + ] + }, + "REGION_ROUTE112/CABLE_CAR_STATION_ENTRANCE": { + "parent_map": "MAP_ROUTE112", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE112/SOUTH_EAST" + ], + "warps": [ + "MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1" + ] + }, + "REGION_ROUTE112/SOUTH_WEST": { + "parent_map": "MAP_ROUTE112", + "locations": [ + "ITEM_ROUTE_112_NUGGET" + ], + "events": [], + "exits": [ + "REGION_ROUTE112/SOUTH_EAST", + "REGION_LAVARIDGE_TOWN/MAIN" + ], + "warps": [ + "MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1" + ] + }, + "REGION_ROUTE112/NORTH": { + "parent_map": "MAP_ROUTE112", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE111/NORTH" + ], + "warps": [ + "MAP_ROUTE112:5/MAP_FIERY_PATH:1" + ] + }, + "REGION_ROUTE112_CABLE_CAR_STATION/MAIN": { + "parent_map": "MAP_ROUTE112_CABLE_CAR_STATION", + "locations": [], + "events": [], + "exits": [ + "REGION_MT_CHIMNEY_CABLE_CAR_STATION/MAIN" + ], + "warps": [ + "MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1" + ] + }, + "REGION_MT_CHIMNEY_CABLE_CAR_STATION/MAIN": { + "parent_map": "MAP_MT_CHIMNEY_CABLE_CAR_STATION", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE112_CABLE_CAR_STATION/MAIN" + ], + "warps": [ + "MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1" + ] + }, + "REGION_MT_CHIMNEY/MAIN": { + "parent_map": "MAP_MT_CHIMNEY", + "locations": [ + "NPC_GIFT_RECEIVED_METEORITE" + ], + "events": [ + "EVENT_RECOVER_METEORITE" + ], + "exits": [], + "warps": [ + "MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1", + "MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3" + ] + }, + "REGION_JAGGED_PASS/TOP": { + "parent_map": "MAP_JAGGED_PASS", + "locations": [ + "HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL" + ], + "events": [], + "exits": [ + "REGION_JAGGED_PASS/MIDDLE" + ], + "warps": [ + "MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3" + ] + }, + "REGION_JAGGED_PASS/MIDDLE": { + "parent_map": "MAP_JAGGED_PASS", + "locations": [ + "ITEM_JAGGED_PASS_BURN_HEAL", + "HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL" + ], + "events": [], + "exits": [ + "REGION_JAGGED_PASS/TOP", + "REGION_JAGGED_PASS/BOTTOM" + ], + "warps": [ + "MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0" + ] + }, + "REGION_JAGGED_PASS/BOTTOM": { + "parent_map": "MAP_JAGGED_PASS", + "locations": [], + "events": [], + "exits": [ + "REGION_JAGGED_PASS/MIDDLE" + ], + "warps": [ + "MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3" + ] + }, + "REGION_ROUTE113/MAIN": { + "parent_map": "MAP_ROUTE113", + "locations": [ + "ITEM_ROUTE_113_MAX_ETHER", + "ITEM_ROUTE_113_SUPER_REPEL", + "ITEM_ROUTE_113_HYPER_POTION", + "HIDDEN_ITEM_ROUTE_113_ETHER", + "HIDDEN_ITEM_ROUTE_113_TM32", + "HIDDEN_ITEM_ROUTE_113_NUGGET" + ], + "events": [], + "exits": [ + "REGION_FALLARBOR_TOWN/MAIN", + "REGION_ROUTE111/NORTH" + ], + "warps": [ + "MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0" + ] + }, + "REGION_ROUTE113_GLASS_WORKSHOP/MAIN": { + "parent_map": "MAP_ROUTE113_GLASS_WORKSHOP", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0" + ] + }, + "REGION_ROUTE114/MAIN": { + "parent_map": "MAP_ROUTE114", + "locations": [ + "ITEM_ROUTE_114_PROTEIN", + "ITEM_ROUTE_114_ENERGY_POWDER", + "HIDDEN_ITEM_ROUTE_114_REVIVE", + "HIDDEN_ITEM_ROUTE_114_CARBOS", + "NPC_GIFT_RECEIVED_TM05" + ], + "events": [], + "exits": [ + "REGION_ROUTE114/ABOVE_WATERFALL", + "REGION_FALLARBOR_TOWN/MAIN" + ], + "warps": [ + "MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0", + "MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0", + "MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0" + ] + }, + "REGION_ROUTE114/ABOVE_WATERFALL": { + "parent_map": "MAP_ROUTE114", + "locations": [ + "ITEM_ROUTE_114_RARE_CANDY" + ], + "events": [], + "exits": [ + "REGION_ROUTE114/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE114_FOSSIL_MANIACS_HOUSE/MAIN": { + "parent_map": "MAP_ROUTE114_FOSSIL_MANIACS_HOUSE", + "locations": [ + "NPC_GIFT_RECEIVED_TM28" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1", + "MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0" + ] + }, + "REGION_ROUTE114_FOSSIL_MANIACS_TUNNEL/MAIN": { + "parent_map": "MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2", + "MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0" + ] + }, + "REGION_DESERT_UNDERPASS/MAIN": { + "parent_map": "MAP_DESERT_UNDERPASS", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2" + ] + }, + "REGION_ROUTE114_LANETTES_HOUSE/MAIN": { + "parent_map": "MAP_ROUTE114_LANETTES_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2" + ] + }, + "REGION_ROUTE115/SOUTH_BELOW_LEDGE": { + "parent_map": "MAP_ROUTE115", + "locations": [ + "ITEM_ROUTE_115_SUPER_POTION" + ], + "events": [], + "exits": [ + "REGION_ROUTE115/SEA", + "REGION_RUSTBORO_CITY/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE": { + "parent_map": "MAP_ROUTE115", + "locations": [ + "HIDDEN_ITEM_ROUTE_115_HEART_SCALE" + ], + "events": [], + "exits": [ + "REGION_ROUTE115/SOUTH_ABOVE_LEDGE", + "REGION_ROUTE115/SEA" + ], + "warps": [] + }, + "REGION_ROUTE115/SOUTH_ABOVE_LEDGE": { + "parent_map": "MAP_ROUTE115", + "locations": [ + "ITEM_ROUTE_115_PP_UP" + ], + "events": [], + "exits": [ + "REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE", + "REGION_ROUTE115/SOUTH_BELOW_LEDGE", + "REGION_ROUTE115/SOUTH_BEHIND_ROCK" + ], + "warps": [ + "MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1" + ] + }, + "REGION_ROUTE115/SOUTH_BEHIND_ROCK": { + "parent_map": "MAP_ROUTE115", + "locations": [ + "ITEM_ROUTE_115_GREAT_BALL" + ], + "events": [], + "exits": [ + "REGION_ROUTE115/SOUTH_ABOVE_LEDGE" + ], + "warps": [] + }, + "REGION_ROUTE115/NORTH_BELOW_SLOPE": { + "parent_map": "MAP_ROUTE115", + "locations": [ + "ITEM_ROUTE_115_HEAL_POWDER", + "ITEM_ROUTE_115_TM01" + ], + "events": [], + "exits": [ + "REGION_ROUTE115/NORTH_ABOVE_SLOPE", + "REGION_ROUTE115/SEA" + ], + "warps": [] + }, + "REGION_ROUTE115/NORTH_ABOVE_SLOPE": { + "parent_map": "MAP_ROUTE115", + "locations": [ + "ITEM_ROUTE_115_IRON" + ], + "events": [], + "exits": [ + "REGION_ROUTE115/NORTH_BELOW_SLOPE" + ], + "warps": [] + }, + "REGION_ROUTE115/SEA": { + "parent_map": "MAP_ROUTE115", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE115/SOUTH_BELOW_LEDGE", + "REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE", + "REGION_ROUTE115/NORTH_BELOW_SLOPE" + ], + "warps": [] + }, + "REGION_ROUTE116/WEST": { + "parent_map": "MAP_ROUTE116", + "locations": [ + "ITEM_ROUTE_116_REPEL", + "ITEM_ROUTE_116_X_SPECIAL", + "NPC_GIFT_RECEIVED_REPEAT_BALL" + ], + "events": [], + "exits": [ + "REGION_ROUTE116/WEST_ABOVE_LEDGE", + "REGION_RUSTBORO_CITY/MAIN" + ], + "warps": [ + "MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0", + "MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0" + ] + }, + "REGION_ROUTE116/WEST_ABOVE_LEDGE": { + "parent_map": "MAP_ROUTE116", + "locations": [ + "ITEM_ROUTE_116_ETHER", + "ITEM_ROUTE_116_POTION", + "HIDDEN_ITEM_ROUTE_116_SUPER_POTION" + ], + "events": [], + "exits": [ + "REGION_ROUTE116/WEST" + ], + "warps": [] + }, + "REGION_ROUTE116/EAST": { + "parent_map": "MAP_ROUTE116", + "locations": [ + "ITEM_ROUTE_116_HP_UP", + "HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2" + ] + }, + "REGION_ROUTE116_TUNNELERS_REST_HOUSE/MAIN": { + "parent_map": "MAP_ROUTE116_TUNNELERS_REST_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1" + ] + }, + "REGION_ROUTE117/MAIN": { + "parent_map": "MAP_ROUTE117", + "locations": [ + "ITEM_ROUTE_117_GREAT_BALL", + "ITEM_ROUTE_117_REVIVE", + "HIDDEN_ITEM_ROUTE_117_REPEL" + ], + "events": [], + "exits": [ + "REGION_VERDANTURF_TOWN/MAIN", + "REGION_MAUVILLE_CITY/MAIN" + ], + "warps": [ + "MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0" + ] + }, + "REGION_ROUTE117_POKEMON_DAY_CARE/MAIN": { + "parent_map": "MAP_ROUTE117_POKEMON_DAY_CARE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0" + ] + }, + "REGION_ROUTE118/WEST": { + "parent_map": "MAP_ROUTE118", + "locations": [ + "HIDDEN_ITEM_ROUTE_118_HEART_SCALE" + ], + "events": [], + "exits": [ + "REGION_MAUVILLE_CITY/MAIN", + "REGION_ROUTE118/WATER" + ], + "warps": [] + }, + "REGION_ROUTE118/WATER": { + "parent_map": "MAP_ROUTE118", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE118/WEST", + "REGION_ROUTE118/EAST" + ], + "warps": [] + }, + "REGION_ROUTE118/EAST": { + "parent_map": "MAP_ROUTE118", + "locations": [ + "ITEM_ROUTE_118_HYPER_POTION", + "HIDDEN_ITEM_ROUTE_118_IRON", + "NPC_GIFT_RECEIVED_GOOD_ROD" + ], + "events": [], + "exits": [ + "REGION_ROUTE118/WATER", + "REGION_ROUTE119/LOWER", + "REGION_ROUTE123/WEST" + ], + "warps": [] + }, + "REGION_ROUTE119/LOWER": { + "parent_map": "MAP_ROUTE119", + "locations": [ + "ITEM_ROUTE_119_SUPER_REPEL", + "ITEM_ROUTE_119_HYPER_POTION_1", + "HIDDEN_ITEM_ROUTE_119_FULL_HEAL" + ], + "events": [], + "exits": [ + "REGION_ROUTE119/MIDDLE", + "REGION_ROUTE119/LOWER_ACROSS_WATER", + "REGION_ROUTE119/LOWER_ACROSS_RAILS", + "REGION_ROUTE118/EAST" + ], + "warps": [ + "MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0" + ] + }, + "REGION_ROUTE119/LOWER_ACROSS_WATER": { + "parent_map": "MAP_ROUTE119", + "locations": [ + "ITEM_ROUTE_119_ZINC" + ], + "events": [], + "exits": [ + "REGION_ROUTE119/LOWER" + ], + "warps": [] + }, + "REGION_ROUTE119/LOWER_ACROSS_RAILS": { + "parent_map": "MAP_ROUTE119", + "locations": [ + "HIDDEN_ITEM_ROUTE_119_CALCIUM" + ], + "events": [], + "exits": [ + "REGION_ROUTE119/LOWER" + ], + "warps": [] + }, + "REGION_ROUTE119/MIDDLE": { + "parent_map": "MAP_ROUTE119", + "locations": [ + "ITEM_ROUTE_119_ELIXIR_1", + "ITEM_ROUTE_119_HYPER_POTION_2" + ], + "events": [], + "exits": [ + "REGION_ROUTE119/LOWER", + "REGION_ROUTE119/UPPER" + ], + "warps": [ + "MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0" + ] + }, + "REGION_ROUTE119/MIDDLE_RIVER": { + "parent_map": "MAP_ROUTE119", + "locations": [ + "ITEM_ROUTE_119_LEAF_STONE", + "HIDDEN_ITEM_ROUTE_119_ULTRA_BALL", + "HIDDEN_ITEM_ROUTE_119_MAX_ETHER" + ], + "events": [], + "exits": [ + "REGION_ROUTE119/UPPER", + "REGION_ROUTE119/ABOVE_WATERFALL" + ], + "warps": [] + }, + "REGION_ROUTE119/UPPER": { + "parent_map": "MAP_ROUTE119", + "locations": [ + "ITEM_ROUTE_119_ELIXIR_2", + "NPC_GIFT_RECEIVED_HM02" + ], + "events": [], + "exits": [ + "REGION_ROUTE119/MIDDLE", + "REGION_ROUTE119/MIDDLE_RIVER", + "REGION_FORTREE_CITY/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE119/ABOVE_WATERFALL": { + "parent_map": "MAP_ROUTE119", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE119/MIDDLE_RIVER", + "REGION_ROUTE119/ABOVE_WATERFALL_ACROSS_RAILS" + ], + "warps": [] + }, + "REGION_ROUTE119/ABOVE_WATERFALL_ACROSS_RAILS": { + "parent_map": "MAP_ROUTE119", + "locations": [ + "ITEM_ROUTE_119_RARE_CANDY", + "ITEM_ROUTE_119_NUGGET" + ], + "events": [], + "exits": [ + "REGION_ROUTE119/ABOVE_WATERFALL" + ], + "warps": [] + }, + "REGION_ROUTE119_WEATHER_INSTITUTE_1F/MAIN": { + "parent_map": "MAP_ROUTE119_WEATHER_INSTITUTE_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0", + "MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0" + ] + }, + "REGION_ROUTE119_WEATHER_INSTITUTE_2F/MAIN": { + "parent_map": "MAP_ROUTE119_WEATHER_INSTITUTE_2F", + "locations": [], + "events": [ + "EVENT_DEFEAT_SHELLY" + ], + "exits": [], + "warps": [ + "MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2" + ] + }, + "REGION_ROUTE119_HOUSE/MAIN": { + "parent_map": "MAP_ROUTE119_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1" + ] + }, + "REGION_ROUTE120/NORTH": { + "parent_map": "MAP_ROUTE120", + "locations": [ + "HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1", + "HIDDEN_ITEM_ROUTE_120_REVIVE", + "NPC_GIFT_RECEIVED_DEVON_SCOPE" + ], + "events": [], + "exits": [ + "REGION_FORTREE_CITY/MAIN", + "REGION_ROUTE120/NORTH_POND_SHORE", + "REGION_ROUTE120/SOUTH" + ], + "warps": [] + }, + "REGION_ROUTE120/NORTH_POND_SHORE": { + "parent_map": "MAP_ROUTE120", + "locations": [ + "ITEM_ROUTE_120_NEST_BALL" + ], + "events": [], + "exits": [ + "REGION_ROUTE120/NORTH", + "REGION_ROUTE120/NORTH_POND" + ], + "warps": [] + }, + "REGION_ROUTE120/NORTH_POND": { + "parent_map": "MAP_ROUTE120", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE120/NORTH_POND_SHORE" + ], + "warps": [ + "MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0" + ] + }, + "REGION_ROUTE120/SOUTH": { + "parent_map": "MAP_ROUTE120", + "locations": [ + "ITEM_ROUTE_120_NUGGET", + "ITEM_ROUTE_120_FULL_HEAL", + "ITEM_ROUTE_120_REVIVE", + "ITEM_ROUTE_120_HYPER_POTION", + "HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2", + "HIDDEN_ITEM_ROUTE_120_ZINC" + ], + "events": [], + "exits": [ + "REGION_ROUTE120/NORTH", + "REGION_ROUTE121/WEST" + ], + "warps": [ + "MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0" + ] + }, + "REGION_ROUTE121/WEST": { + "parent_map": "MAP_ROUTE121", + "locations": [ + "HIDDEN_ITEM_ROUTE_121_HP_UP" + ], + "events": [], + "exits": [ + "REGION_ROUTE121/EAST", + "REGION_ROUTE120/SOUTH" + ], + "warps": [] + }, + "REGION_ROUTE121/EAST": { + "parent_map": "MAP_ROUTE121", + "locations": [ + "ITEM_ROUTE_121_CARBOS", + "ITEM_ROUTE_121_REVIVE", + "ITEM_ROUTE_121_ZINC", + "HIDDEN_ITEM_ROUTE_121_NUGGET", + "HIDDEN_ITEM_ROUTE_121_FULL_HEAL", + "HIDDEN_ITEM_ROUTE_121_MAX_REVIVE" + ], + "events": [], + "exits": [ + "REGION_ROUTE121/WEST", + "REGION_ROUTE122/SEA", + "REGION_LILYCOVE_CITY/MAIN" + ], + "warps": [ + "MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2" + ] + }, + "REGION_ROUTE121_SAFARI_ZONE_ENTRANCE/MAIN": { + "parent_map": "MAP_ROUTE121_SAFARI_ZONE_ENTRANCE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0", + "MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0" + ] + }, + "REGION_SAFARI_ZONE_NORTH/MAIN": { + "parent_map": "MAP_SAFARI_ZONE_NORTH", + "locations": [ + "ITEM_SAFARI_ZONE_NORTH_CALCIUM" + ], + "events": [], + "exits": [ + "REGION_SAFARI_ZONE_SOUTH/MAIN" + ], + "warps": [] + }, + "REGION_SAFARI_ZONE_NORTHWEST/MAIN": { + "parent_map": "MAP_SAFARI_ZONE_NORTHWEST", + "locations": [ + "ITEM_SAFARI_ZONE_NORTH_WEST_TM22" + ], + "events": [], + "exits": [ + "REGION_SAFARI_ZONE_SOUTHWEST/MAIN" + ], + "warps": [] + }, + "REGION_SAFARI_ZONE_NORTHEAST/MAIN": { + "parent_map": "MAP_SAFARI_ZONE_NORTHEAST", + "locations": [ + "ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET", + "HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY", + "HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC" + ], + "events": [], + "exits": [ + "REGION_SAFARI_ZONE_SOUTHEAST/MAIN" + ], + "warps": [] + }, + "REGION_SAFARI_ZONE_SOUTH/MAIN": { + "parent_map": "MAP_SAFARI_ZONE_SOUTH", + "locations": [], + "events": [], + "exits": [ + "REGION_SAFARI_ZONE_NORTH/MAIN", + "REGION_SAFARI_ZONE_SOUTHEAST/MAIN", + "REGION_SAFARI_ZONE_SOUTHWEST/MAIN" + ], + "warps": [ + "MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0" + ] + }, + "REGION_SAFARI_ZONE_SOUTHWEST/MAIN": { + "parent_map": "MAP_SAFARI_ZONE_SOUTHWEST", + "locations": [ + "ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE" + ], + "events": [], + "exits": [ + "REGION_SAFARI_ZONE_SOUTH/MAIN", + "REGION_SAFARI_ZONE_NORTHWEST/MAIN" + ], + "warps": [ + "MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0" + ] + }, + "REGION_SAFARI_ZONE_SOUTHEAST/MAIN": { + "parent_map": "MAP_SAFARI_ZONE_SOUTHEAST", + "locations": [ + "ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL", + "HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP", + "HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE" + ], + "events": [], + "exits": [ + "REGION_SAFARI_ZONE_SOUTH/MAIN", + "REGION_SAFARI_ZONE_NORTHEAST/MAIN" + ], + "warps": [] + }, + "REGION_SAFARI_ZONE_REST_HOUSE/MAIN": { + "parent_map": "MAP_SAFARI_ZONE_REST_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0" + ] + }, + "REGION_ROUTE122/SEA": { + "parent_map": "MAP_ROUTE122", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE122/MT_PYRE_ENTRANCE", + "REGION_ROUTE121/EAST", + "REGION_ROUTE123/EAST" + ], + "warps": [] + }, + "REGION_ROUTE122/MT_PYRE_ENTRANCE": { + "parent_map": "MAP_ROUTE122", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE122/SEA" + ], + "warps": [ + "MAP_ROUTE122:0/MAP_MT_PYRE_1F:0" + ] + }, + "REGION_ROUTE123/WEST": { + "parent_map": "MAP_ROUTE123", + "locations": [ + "ITEM_ROUTE_123_ULTRA_BALL", + "HIDDEN_ITEM_ROUTE_123_REVIVE" + ], + "events": [], + "exits": [ + "REGION_ROUTE118/EAST" + ], + "warps": [ + "MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0" + ] + }, + "REGION_ROUTE123/EAST": { + "parent_map": "MAP_ROUTE123", + "locations": [ + "ITEM_ROUTE_123_CALCIUM", + "ITEM_ROUTE_123_ELIXIR", + "ITEM_ROUTE_123_PP_UP", + "ITEM_ROUTE_123_REVIVAL_HERB", + "HIDDEN_ITEM_ROUTE_123_SUPER_REPEL", + "HIDDEN_ITEM_ROUTE_123_HYPER_POTION", + "NPC_GIFT_RECEIVED_TM19" + ], + "events": [], + "exits": [ + "REGION_ROUTE123/WEST", + "REGION_ROUTE123/EAST_BEHIND_TREE", + "REGION_ROUTE122/SEA" + ], + "warps": [] + }, + "REGION_ROUTE123/EAST_BEHIND_TREE": { + "parent_map": "MAP_ROUTE123", + "locations": [ + "HIDDEN_ITEM_ROUTE_123_PP_UP", + "HIDDEN_ITEM_ROUTE_123_RARE_CANDY" + ], + "events": [], + "exits": [ + "REGION_ROUTE123/EAST" + ], + "warps": [] + }, + "REGION_ROUTE123_BERRY_MASTERS_HOUSE/MAIN": { + "parent_map": "MAP_ROUTE123_BERRY_MASTERS_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0" + ] + }, + "REGION_ROUTE124/MAIN": { + "parent_map": "MAP_ROUTE124", + "locations": [], + "events": [], + "exits": [ + "REGION_LILYCOVE_CITY/MAIN", + "REGION_MOSSDEEP_CITY/MAIN", + "REGION_UNDERWATER_ROUTE124/BIG_AREA", + "REGION_UNDERWATER_ROUTE124/SMALL_AREA_1", + "REGION_UNDERWATER_ROUTE124/SMALL_AREA_2", + "REGION_UNDERWATER_ROUTE124/SMALL_AREA_3", + "REGION_UNDERWATER_ROUTE124/TUNNEL_1", + "REGION_UNDERWATER_ROUTE124/TUNNEL_2", + "REGION_UNDERWATER_ROUTE124/TUNNEL_3", + "REGION_UNDERWATER_ROUTE124/TUNNEL_4" + ], + "warps": [ + "MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0" + ] + }, + "REGION_ROUTE124/NORTH_ENCLOSED_AREA_1": { + "parent_map": "MAP_ROUTE124", + "locations": [ + "ITEM_ROUTE_124_RED_SHARD" + ], + "events": [], + "exits": [ + "REGION_UNDERWATER_ROUTE124/TUNNEL_1" + ], + "warps": [] + }, + "REGION_ROUTE124/NORTH_ENCLOSED_AREA_2": { + "parent_map": "MAP_ROUTE124", + "locations": [], + "events": [], + "exits": [ + "REGION_UNDERWATER_ROUTE124/TUNNEL_1" + ], + "warps": [] + }, + "REGION_ROUTE124/NORTH_ENCLOSED_AREA_3": { + "parent_map": "MAP_ROUTE124", + "locations": [ + "ITEM_ROUTE_124_YELLOW_SHARD" + ], + "events": [], + "exits": [ + "REGION_UNDERWATER_ROUTE124/TUNNEL_2" + ], + "warps": [] + }, + "REGION_ROUTE124/SOUTH_ENCLOSED_AREA_1": { + "parent_map": "MAP_ROUTE124", + "locations": [ + "ITEM_ROUTE_124_BLUE_SHARD" + ], + "events": [], + "exits": [ + "REGION_UNDERWATER_ROUTE124/TUNNEL_3" + ], + "warps": [] + }, + "REGION_ROUTE124/SOUTH_ENCLOSED_AREA_2": { + "parent_map": "MAP_ROUTE124", + "locations": [], + "events": [], + "exits": [ + "REGION_UNDERWATER_ROUTE124/TUNNEL_3" + ], + "warps": [] + }, + "REGION_ROUTE124/SOUTH_ENCLOSED_AREA_3": { + "parent_map": "MAP_ROUTE124", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE126/NEAR_ROUTE_124", + "REGION_UNDERWATER_ROUTE124/TUNNEL_4" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE124/BIG_AREA": { + "parent_map": "MAP_UNDERWATER_ROUTE124", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD" + ], + "events": [], + "exits": [ + "REGION_ROUTE124/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE124/SMALL_AREA_1": { + "parent_map": "MAP_UNDERWATER_ROUTE124", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_124_PEARL" + ], + "events": [], + "exits": [ + "REGION_ROUTE124/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE124/SMALL_AREA_2": { + "parent_map": "MAP_UNDERWATER_ROUTE124", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL" + ], + "events": [], + "exits": [ + "REGION_ROUTE124/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE124/SMALL_AREA_3": { + "parent_map": "MAP_UNDERWATER_ROUTE124", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1" + ], + "events": [], + "exits": [ + "REGION_ROUTE124/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE124/TUNNEL_1": { + "parent_map": "MAP_UNDERWATER_ROUTE124", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_124_CALCIUM", + "HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2" + ], + "events": [], + "exits": [ + "REGION_ROUTE124/NORTH_ENCLOSED_AREA_1", + "REGION_ROUTE124/NORTH_ENCLOSED_AREA_2", + "REGION_ROUTE124/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE124/TUNNEL_2": { + "parent_map": "MAP_UNDERWATER_ROUTE124", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE124/NORTH_ENCLOSED_AREA_3", + "REGION_ROUTE124/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE124/TUNNEL_3": { + "parent_map": "MAP_UNDERWATER_ROUTE124", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_124_CARBOS" + ], + "events": [], + "exits": [ + "REGION_ROUTE124/SOUTH_ENCLOSED_AREA_1", + "REGION_ROUTE124/SOUTH_ENCLOSED_AREA_2", + "REGION_ROUTE124/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE124/TUNNEL_4": { + "parent_map": "MAP_UNDERWATER_ROUTE124", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE124/SOUTH_ENCLOSED_AREA_3", + "REGION_ROUTE124/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE/MAIN": { + "parent_map": "MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0" + ] + }, + "REGION_ROUTE125/SEA": { + "parent_map": "MAP_ROUTE125", + "locations": [ + "ITEM_ROUTE_125_BIG_PEARL" + ], + "events": [], + "exits": [ + "REGION_ROUTE125/SHOAL_CAVE_ENTRANCE", + "REGION_MOSSDEEP_CITY/MAIN", + "REGION_UNDERWATER_ROUTE125/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE125/SHOAL_CAVE_ENTRANCE": { + "parent_map": "MAP_ROUTE125", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE125/SEA" + ], + "warps": [ + "MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0" + ] + }, + "REGION_UNDERWATER_ROUTE125/MAIN": { + "parent_map": "MAP_UNDERWATER_ROUTE125", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE125/SEA" + ], + "warps": [] + }, + "REGION_ROUTE126/MAIN": { + "parent_map": "MAP_ROUTE126", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE127/MAIN", + "REGION_UNDERWATER_ROUTE126/MAIN", + "REGION_UNDERWATER_ROUTE126/SMALL_AREA_2" + ], + "warps": [] + }, + "REGION_ROUTE126/NEAR_ROUTE_124": { + "parent_map": "MAP_ROUTE126", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE124/SOUTH_ENCLOSED_AREA_3", + "REGION_UNDERWATER_ROUTE126/TUNNEL" + ], + "warps": [] + }, + "REGION_ROUTE126/NORTH_WEST_CORNER": { + "parent_map": "MAP_ROUTE126", + "locations": [ + "ITEM_ROUTE_126_GREEN_SHARD" + ], + "events": [], + "exits": [ + "REGION_UNDERWATER_ROUTE126/TUNNEL" + ], + "warps": [] + }, + "REGION_ROUTE126/WEST": { + "parent_map": "MAP_ROUTE126", + "locations": [], + "events": [], + "exits": [ + "REGION_UNDERWATER_ROUTE126/SMALL_AREA_1", + "REGION_UNDERWATER_ROUTE126/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE126/MAIN": { + "parent_map": "MAP_UNDERWATER_ROUTE126", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE", + "HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL", + "HIDDEN_ITEM_UNDERWATER_126_STARDUST", + "HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL" + ], + "events": [], + "exits": [ + "REGION_ROUTE126/MAIN", + "REGION_ROUTE126/WEST" + ], + "warps": [ + "MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0" + ] + }, + "REGION_UNDERWATER_ROUTE126/TUNNEL": { + "parent_map": "MAP_UNDERWATER_ROUTE126", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE126/NORTH_WEST_CORNER", + "REGION_ROUTE126/NEAR_ROUTE_124" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE126/SMALL_AREA_1": { + "parent_map": "MAP_UNDERWATER_ROUTE126", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_126_PEARL", + "HIDDEN_ITEM_UNDERWATER_126_IRON", + "HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD" + ], + "events": [], + "exits": [ + "REGION_ROUTE126/WEST" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE126/SMALL_AREA_2": { + "parent_map": "MAP_UNDERWATER_ROUTE126", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD" + ], + "events": [], + "exits": [ + "REGION_ROUTE126/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE127/MAIN": { + "parent_map": "MAP_ROUTE127", + "locations": [ + "ITEM_ROUTE_127_ZINC", + "ITEM_ROUTE_127_RARE_CANDY" + ], + "events": [], + "exits": [ + "REGION_ROUTE126/MAIN", + "REGION_MOSSDEEP_CITY/MAIN", + "REGION_ROUTE128/MAIN", + "REGION_UNDERWATER_ROUTE127/MAIN", + "REGION_UNDERWATER_ROUTE127/TUNNEL", + "REGION_UNDERWATER_ROUTE127/AREA_1", + "REGION_UNDERWATER_ROUTE127/AREA_2", + "REGION_UNDERWATER_ROUTE127/AREA_3" + ], + "warps": [] + }, + "REGION_ROUTE127/ENCLOSED_AREA": { + "parent_map": "MAP_ROUTE127", + "locations": [ + "ITEM_ROUTE_127_CARBOS" + ], + "events": [], + "exits": [ + "REGION_UNDERWATER_ROUTE127/TUNNEL" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE127/MAIN": { + "parent_map": "MAP_UNDERWATER_ROUTE127", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE" + ], + "events": [], + "exits": [ + "REGION_ROUTE127/MAIN", + "REGION_UNDERWATER_ROUTE128/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE127/TUNNEL": { + "parent_map": "MAP_UNDERWATER_ROUTE127", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE127/MAIN", + "REGION_ROUTE127/ENCLOSED_AREA" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE127/AREA_1": { + "parent_map": "MAP_UNDERWATER_ROUTE127", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE" + ], + "events": [], + "exits": [ + "REGION_ROUTE127/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE127/AREA_2": { + "parent_map": "MAP_UNDERWATER_ROUTE127", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_127_HP_UP" + ], + "events": [], + "exits": [ + "REGION_ROUTE127/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE127/AREA_3": { + "parent_map": "MAP_UNDERWATER_ROUTE127", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_127_RED_SHARD" + ], + "events": [], + "exits": [ + "REGION_ROUTE127/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE128/MAIN": { + "parent_map": "MAP_ROUTE128", + "locations": [ + "HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1", + "HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2", + "HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3" + ], + "events": [], + "exits": [ + "REGION_ROUTE127/MAIN", + "REGION_ROUTE129/MAIN", + "REGION_EVER_GRANDE_CITY/SEA", + "REGION_UNDERWATER_ROUTE128/MAIN", + "REGION_UNDERWATER_ROUTE128/AREA_1", + "REGION_UNDERWATER_ROUTE128/AREA_2" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE128/MAIN": { + "parent_map": "MAP_UNDERWATER_ROUTE128", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE128/MAIN", + "REGION_UNDERWATER_ROUTE127/MAIN" + ], + "warps": [ + "MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0" + ] + }, + "REGION_UNDERWATER_ROUTE128/AREA_1": { + "parent_map": "MAP_UNDERWATER_ROUTE128", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_128_PROTEIN" + ], + "events": [], + "exits": [ + "REGION_ROUTE128/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE128/AREA_2": { + "parent_map": "MAP_UNDERWATER_ROUTE128", + "locations": [ + "HIDDEN_ITEM_UNDERWATER_128_PEARL" + ], + "events": [], + "exits": [ + "REGION_ROUTE128/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE129/MAIN": { + "parent_map": "MAP_ROUTE129", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE130/MAIN", + "REGION_ROUTE128/MAIN", + "REGION_UNDERWATER_ROUTE129/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE129/MAIN": { + "parent_map": "MAP_UNDERWATER_ROUTE129", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE129/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE130/MAIN": { + "parent_map": "MAP_ROUTE130", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE129/MAIN", + "REGION_ROUTE131/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE131/MAIN": { + "parent_map": "MAP_ROUTE131", + "locations": [], + "events": [], + "exits": [ + "REGION_PACIFIDLOG_TOWN/MAIN", + "REGION_ROUTE130/MAIN" + ], + "warps": [ + "MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0" + ] + }, + "REGION_ROUTE132/EAST": { + "parent_map": "MAP_ROUTE132", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE132/WEST", + "REGION_PACIFIDLOG_TOWN/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE132/WEST": { + "parent_map": "MAP_ROUTE132", + "locations": [ + "ITEM_ROUTE_132_RARE_CANDY", + "ITEM_ROUTE_132_PROTEIN" + ], + "events": [], + "exits": [ + "REGION_ROUTE133/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE133/MAIN": { + "parent_map": "MAP_ROUTE133", + "locations": [ + "ITEM_ROUTE_133_BIG_PEARL", + "ITEM_ROUTE_133_STAR_PIECE", + "ITEM_ROUTE_133_MAX_REVIVE" + ], + "events": [], + "exits": [ + "REGION_ROUTE134/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE134/MAIN": { + "parent_map": "MAP_ROUTE134", + "locations": [ + "ITEM_ROUTE_134_CARBOS", + "ITEM_ROUTE_134_STAR_PIECE" + ], + "events": [], + "exits": [ + "REGION_ROUTE134/WEST", + "REGION_UNDERWATER_ROUTE134/MAIN" + ], + "warps": [] + }, + "REGION_ROUTE134/WEST": { + "parent_map": "MAP_ROUTE134", + "locations": [], + "events": [], + "exits": [ + "REGION_SLATEPORT_CITY/MAIN" + ], + "warps": [] + }, + "REGION_UNDERWATER_ROUTE134/MAIN": { + "parent_map": "MAP_UNDERWATER_ROUTE134", + "locations": [], + "events": [], + "exits": [ + "REGION_ROUTE134/MAIN" + ], + "warps": [ + "MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0" + ] + } +} \ No newline at end of file diff --git a/worlds/pokemon_emerald/data/regions/unused/battle_frontier.json b/worlds/pokemon_emerald/data/regions/unused/battle_frontier.json new file mode 100644 index 000000000000..3fdab431c22d --- /dev/null +++ b/worlds/pokemon_emerald/data/regions/unused/battle_frontier.json @@ -0,0 +1,396 @@ +{ + "REGION_BATTLE_FRONTIER_RECEPTION_GATE/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_RECEPTION_GATE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8", + "MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9" + ] + }, + "REGION_BATTLE_FRONTIER_OUTSIDE_WEST/DOCK": { + "parent_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", + "locations": [], + "events": [], + "exits": [ + "REGION_SLATEPORT_CITY_HARBOR/MAIN", + "REGION_LILYCOVE_CITY_HARBOR/MAIN" + ], + "warps": [ + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0" + ] + }, + "REGION_BATTLE_FRONTIER_OUTSIDE_WEST/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", + "locations": [], + "events": [], + "exits": [ + "REGION_BATTLE_FRONTIER_OUTSIDE_EAST/MAIN" + ], + "warps": [ + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0" + ] + }, + "REGION_BATTLE_FRONTIER_OUTSIDE_WEST/WATER": { + "parent_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", + "locations": [], + "events": [], + "exits": [ + "REGION_BATTLE_FRONTIER_OUTSIDE_EAST/WATER", + "REGION_BATTLE_FRONTIER_OUTSIDE_WEST/CAVE_ENTRANCE" + ], + "warps": [] + }, + "REGION_BATTLE_FRONTIER_OUTSIDE_WEST/CAVE_ENTRANCE": { + "parent_map": "MAP_BATTLE_FRONTIER_OUTSIDE_WEST", + "locations": [], + "events": [], + "exits": [ + "REGION_BATTLE_FRONTIER_OUTSIDE_WEST/WATER" + ], + "warps": [ + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0" + ] + }, + "REGION_BATTLE_FRONTIER_OUTSIDE_EAST/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", + "locations": [], + "events": [], + "exits": [ + "REGION_BATTLE_FRONTIER_OUTSIDE_WEST/MAIN", + "REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL" + ], + "warps": [ + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0" + ] + }, + "REGION_BATTLE_FRONTIER_OUTSIDE_EAST/CAVE_ENTRANCE": { + "parent_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", + "locations": [], + "events": [], + "exits": [ + "REGION_BATTLE_FRONTIER_OUTSIDE_EAST/MAIN" + ], + "warps": [ + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0" + ] + }, + "REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL": { + "parent_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", + "locations": [], + "events": [], + "exits": [ + "REGION_BATTLE_FRONTIER_OUTSIDE_EAST/MAIN", + "REGION_BATTLE_FRONTIER_OUTSIDE_EAST/WATER" + ], + "warps": [] + }, + "REGION_BATTLE_FRONTIER_OUTSIDE_EAST/WATER": { + "parent_map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", + "locations": [], + "events": [], + "exits": [ + "REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL", + "REGION_BATTLE_FRONTIER_OUTSIDE_WEST/WATER" + ], + "warps": [] + }, + "REGION_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2" + ] + }, + "REGION_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0" + ] + }, + "REGION_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1" + ] + }, + "REGION_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3" + ] + }, + "REGION_BATTLE_FRONTIER_BATTLE_DOME_LOBBY/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1" + ] + }, + "REGION_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!" + ] + }, + "REGION_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!" + ] + }, + "REGION_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0", + "MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2" + ] + }, + "REGION_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "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_CORRIDOR:3/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0!" + ] + }, + "REGION_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2" + ] + }, + "REGION_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "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" + ] + }, + "REGION_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2" + ] + }, + "REGION_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6" + ] + }, + "REGION_BATTLE_FRONTIER_RANKING_HALL/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_RANKING_HALL", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4" + ] + }, + "REGION_BATTLE_FRONTIER_POKEMON_CENTER_1F/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0", + "MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12" + ] + }, + "REGION_BATTLE_FRONTIER_POKEMON_CENTER_2F/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2" + ] + }, + "REGION_BATTLE_FRONTIER_MART/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_MART", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4" + ] + }, + "REGION_BATTLE_FRONTIER_SCOTTS_HOUSE/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_SCOTTS_HOUSE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5" + ] + }, + "REGION_BATTLE_FRONTIER_LOUNGE1/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_LOUNGE1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5" + ] + }, + "REGION_BATTLE_FRONTIER_LOUNGE2/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_LOUNGE2", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3" + ] + }, + "REGION_BATTLE_FRONTIER_LOUNGE3/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_LOUNGE3", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9" + ] + }, + "REGION_BATTLE_FRONTIER_LOUNGE4/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_LOUNGE4", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6" + ] + }, + "REGION_BATTLE_FRONTIER_LOUNGE5/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_LOUNGE5", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7" + ] + }, + "REGION_BATTLE_FRONTIER_LOUNGE6/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_LOUNGE6", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8" + ] + }, + "REGION_BATTLE_FRONTIER_LOUNGE7/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_LOUNGE7", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7" + ] + }, + "REGION_BATTLE_FRONTIER_LOUNGE8/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_LOUNGE8", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10" + ] + }, + "REGION_BATTLE_FRONTIER_LOUNGE9/MAIN": { + "parent_map": "MAP_BATTLE_FRONTIER_LOUNGE9", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11" + ] + }, + + "REGION_ARTISAN_CAVE_1F/MAIN": { + "parent_map": "MAP_ARTISAN_CAVE_1F", + "locations": [ + "ITEM_ARTISAN_CAVE_1F_CARBOS" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1", + "MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13" + ] + }, + "REGION_ARTISAN_CAVE_B1F/MAIN": { + "parent_map": "MAP_ARTISAN_CAVE_B1F", + "locations": [ + "ITEM_ARTISAN_CAVE_B1F_HP_UP", + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC", + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM", + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN", + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10", + "MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1" + ] + } +} diff --git a/worlds/pokemon_emerald/data/regions/unused/dungeons.json b/worlds/pokemon_emerald/data/regions/unused/dungeons.json new file mode 100644 index 000000000000..c176de1b33a9 --- /dev/null +++ b/worlds/pokemon_emerald/data/regions/unused/dungeons.json @@ -0,0 +1,52 @@ +{ + "REGION_TERRA_CAVE_ENTRANCE/MAIN": { + "parent_map": "MAP_TERRA_CAVE_ENTRANCE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!", + "MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0" + ] + }, + "REGION_TERRA_CAVE_END/MAIN": { + "parent_map": "MAP_TERRA_CAVE_END", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1" + ] + }, + "REGION_UNDERWATER_MARINE_CAVE/MAIN": { + "parent_map": "MAP_UNDERWATER_MARINE_CAVE", + "locations": [], + "events": [], + "exits": [ + "REGION_MARINE_CAVE_ENTRANCE/MAIN" + ], + "warps": [ + "MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!" + ] + }, + "REGION_MARINE_CAVE_ENTRANCE/MAIN": { + "parent_map": "MAP_MARINE_CAVE_ENTRANCE", + "locations": [], + "events": [], + "exits": [ + "REGION_UNDERWATER_MARINE_CAVE/MAIN" + ], + "warps": [ + "MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0" + ] + }, + "REGION_MARINE_CAVE_END/MAIN": { + "parent_map": "MAP_MARINE_CAVE_END", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0" + ] + } +} diff --git a/worlds/pokemon_emerald/data/regions/unused/islands.json b/worlds/pokemon_emerald/data/regions/unused/islands.json new file mode 100644 index 000000000000..f7d931d1681c --- /dev/null +++ b/worlds/pokemon_emerald/data/regions/unused/islands.json @@ -0,0 +1,276 @@ +{ + "REGION_SOUTHERN_ISLAND_EXTERIOR/MAIN": { + "parent_map": "MAP_SOUTHERN_ISLAND_EXTERIOR", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1" + ] + }, + "REGION_SOUTHERN_ISLAND_INTERIOR/MAIN": { + "parent_map": "MAP_SOUTHERN_ISLAND_INTERIOR", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1" + ] + }, + "REGION_FARAWAY_ISLAND_ENTRANCE/MAIN": { + "parent_map": "MAP_FARAWAY_ISLAND_ENTRANCE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1" + ] + }, + "REGION_FARAWAY_ISLAND_INTERIOR/MAIN": { + "parent_map": "MAP_FARAWAY_ISLAND_INTERIOR", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1" + ] + }, + "REGION_BIRTH_ISLAND_HARBOR/MAIN": { + "parent_map": "MAP_BIRTH_ISLAND_HARBOR", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0" + ] + }, + "REGION_BIRTH_ISLAND_EXTERIOR/MAIN": { + "parent_map": "MAP_BIRTH_ISLAND_EXTERIOR", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0" + ] + }, + "REGION_NAVEL_ROCK_HARBOR/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_HARBOR", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0" + ] + }, + "REGION_NAVEL_ROCK_EXTERIOR/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_EXTERIOR", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0", + "MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1" + ] + }, + "REGION_NAVEL_ROCK_ENTRANCE/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_ENTRANCE", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0", + "MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1" + ] + }, + "REGION_NAVEL_ROCK_B1F/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_B1F", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0", + "MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1" + ] + }, + "REGION_NAVEL_ROCK_FORK/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_FORK", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0", + "MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1", + "MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0" + ] + }, + "REGION_NAVEL_ROCK_DOWN01/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_DOWN01", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2", + "MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0" + ] + }, + "REGION_NAVEL_ROCK_DOWN02/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_DOWN02", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0", + "MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1" + ] + }, + "REGION_NAVEL_ROCK_DOWN03/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_DOWN03", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1", + "MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0" + ] + }, + "REGION_NAVEL_ROCK_DOWN04/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_DOWN04", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0", + "MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1" + ] + }, + "REGION_NAVEL_ROCK_DOWN05/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_DOWN05", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1", + "MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0" + ] + }, + "REGION_NAVEL_ROCK_DOWN06/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_DOWN06", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0", + "MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1" + ] + }, + "REGION_NAVEL_ROCK_DOWN07/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_DOWN07", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1", + "MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0" + ] + }, + "REGION_NAVEL_ROCK_DOWN08/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_DOWN08", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0", + "MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1" + ] + }, + "REGION_NAVEL_ROCK_DOWN09/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_DOWN09", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1", + "MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0" + ] + }, + "REGION_NAVEL_ROCK_DOWN10/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_DOWN10", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1", + "MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1" + ] + }, + "REGION_NAVEL_ROCK_DOWN11/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_DOWN11", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1", + "MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0" + ] + }, + "REGION_NAVEL_ROCK_BOTTOM/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_BOTTOM", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0" + ] + }, + "REGION_NAVEL_ROCK_UP1/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_UP1", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0", + "MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0" + ] + }, + "REGION_NAVEL_ROCK_UP2/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_UP2", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1", + "MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0" + ] + }, + "REGION_NAVEL_ROCK_UP3/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_UP3", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0", + "MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1" + ] + }, + "REGION_NAVEL_ROCK_UP4/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_UP4", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1", + "MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0" + ] + }, + "REGION_NAVEL_ROCK_TOP/MAIN": { + "parent_map": "MAP_NAVEL_ROCK_TOP", + "locations": [ + "HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH" + ], + "events": [], + "exits": [], + "warps": [ + "MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1" + ] + } +} diff --git a/worlds/pokemon_emerald/data/regions/unused/routes.json b/worlds/pokemon_emerald/data/regions/unused/routes.json new file mode 100644 index 000000000000..47cfc4541572 --- /dev/null +++ b/worlds/pokemon_emerald/data/regions/unused/routes.json @@ -0,0 +1,82 @@ +{ + "REGION_ROUTE110_TRICK_HOUSE_PUZZLE2/MAIN": { + "parent_map": "MAP_ROUTE110_TRICK_HOUSE_PUZZLE2", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:2/MAP_ROUTE110_TRICK_HOUSE_END:0!" + ] + }, + "REGION_ROUTE110_TRICK_HOUSE_PUZZLE3/MAIN": { + "parent_map": "MAP_ROUTE110_TRICK_HOUSE_PUZZLE3", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:2/MAP_ROUTE110_TRICK_HOUSE_END:0!" + ] + }, + "REGION_ROUTE110_TRICK_HOUSE_PUZZLE4/MAIN": { + "parent_map": "MAP_ROUTE110_TRICK_HOUSE_PUZZLE4", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:2/MAP_ROUTE110_TRICK_HOUSE_END:0!" + ] + }, + "REGION_ROUTE110_TRICK_HOUSE_PUZZLE5/MAIN": { + "parent_map": "MAP_ROUTE110_TRICK_HOUSE_PUZZLE5", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:2/MAP_ROUTE110_TRICK_HOUSE_END:0!" + ] + }, + "REGION_ROUTE110_TRICK_HOUSE_PUZZLE6/MAIN": { + "parent_map": "MAP_ROUTE110_TRICK_HOUSE_PUZZLE6", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:2/MAP_ROUTE110_TRICK_HOUSE_END:0!" + ] + }, + "REGION_ROUTE110_TRICK_HOUSE_PUZZLE7/MAIN": { + "parent_map": "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "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:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:2/MAP_ROUTE110_TRICK_HOUSE_END:0!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6" + ] + }, + "REGION_ROUTE110_TRICK_HOUSE_PUZZLE8/MAIN": { + "parent_map": "MAP_ROUTE110_TRICK_HOUSE_PUZZLE8", + "locations": [], + "events": [], + "exits": [], + "warps": [ + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:2/MAP_ROUTE110_TRICK_HOUSE_END:0!" + ] + } +} diff --git a/worlds/pokemon_emerald/docs/en_Pokemon Emerald.md b/worlds/pokemon_emerald/docs/en_Pokemon Emerald.md new file mode 100644 index 000000000000..5d50c37ea95c --- /dev/null +++ b/worlds/pokemon_emerald/docs/en_Pokemon Emerald.md @@ -0,0 +1,78 @@ +# Pokémon Emerald + +## Where is the settings page? + +You can read through all the settings and generate a YAML [here](../player-settings). + +## What does randomization do to this game? + +This randomizer handles both item randomization and pokémon randomization. Badges, HMs, gifts from NPCs, and items on +the ground can all be randomized. There are also many options for randomizing wild pokémon, starters, opponent pokémon, +abilities, types, etc… You can even change a percentage of single battles into double battles. Check the +[settings page](../player-settings) for a more comprehensive list of what can be changed. + +## What items and locations get randomized? + +The most interesting items that can be added to the item pool are badges and HMs, which most affect what locations you +can access. Key items like the Devon Scope or Mach Bike can also be randomized, as well as the many Potions, Revives, +TMs, and other items that you can find on the ground or receive as gifts. + +## What other changes are made to the game? + +There are many quality of life improvements meant to speed up the game a little and improve the experience of playing a +randomizer. Here are some of the more important ones: + +- Shoal Cave switches between high tide and low tide every time you re-enter +- Bag space is greatly expanded (you're all but guaranteed to never need to store items in the PC) +- Trade evolutions have been changed to level or item evolutions +- You can have both bikes simultaneously +- You can run or bike (almost) anywhere +- The Wally catching tutorial is skipped +- All text is instant, and with a setting it can be automatically progressed by holding A +- When a Repel runs out, you will be prompted to use another +- Many more minor improvements… + +## Where is my starting inventory? + +Except for badges, your starting inventory will be in the PC. + +## What does another world's item look like in Pokémon Emerald? + +When you find an item that is not your own, you will instead receive an "ARCHIPELAGO ITEM" which will *not* be added to +your inventory. + +## When the player receives an item, what happens? + +You will only receive items while in the overworld and not during battles. Depending on your `Receive Item Messages` +setting, the received item will either be silently added to your bag or you will be shown a text box with the item's +name and the item will be added to your bag while a fanfare plays. + +## Can I play offline? + +Yes, the client and connector are only necessary for sending and receiving items. If you're playing a solo game, you +don't need to play online unless you want the rest of Archipelago's functionality (like hints and auto-tracking). If +you're playing a multiworld game, the client will sync your game with the server the next time you connect. + +## Will battle mechanics be updated? + +This is something we'd love to see, but it's unlikely. We don't want to force new mechanics on players who would prefer +to play with the classic mechanics, but trying to switch between old and new mechanics based on an option would be a +monumental task, and is probably best solved some other way. + +## Is this randomizer compatible with other mods? + +No, other mods cannot be applied. It would be impossible to generalize this implementation's changes in a way that is +compatible with any other mod or romhack. Romhacks could be added as their own games, but they would have to be +implemented separately. Check out [Archipelago's Discord server](https://discord.gg/8Z65BR2) if you want to make a +suggestion or contribute. + +## Can I use tools like the Universal Pokémon Randomizer? + +No, those tools expect data to be in certain locations and in a certain format, but this randomizer has to shift it +around. Using tools to try to modify the game would only corrupt the ROM. + +We realize this means breaking from established habits when it comes to randomizing Pokémon games, but this randomizer +would be many times more complex to develop if it were constrained by something like UPR. + +The one exception might be PKHeX. You may be able to extract pokémon from your save using PKHeX, but this isn't a +guarantee, and we make no effort to keep our saves compatible with PKHeX. diff --git a/worlds/pokemon_emerald/docs/setup_en.md b/worlds/pokemon_emerald/docs/setup_en.md new file mode 100644 index 000000000000..6a1df8e5c32c --- /dev/null +++ b/worlds/pokemon_emerald/docs/setup_en.md @@ -0,0 +1,72 @@ +# Pokémon Emerald Setup Guide + +## Required Software + +- [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) +- An English Pokémon Emerald ROM. The Archipelago community cannot provide this. +- [BizHawk](https://tasvideos.org/BizHawk/ReleaseHistory) 2.7 or later + +### Configuring BizHawk + +Once you have installed BizHawk, open `EmuHawk.exe` and change the following settings: + +- If you're using BizHawk 2.7 or 2.8, go to `Config > Customize`. On the Advanced tab, switch the Lua Core from +`NLua+KopiLua` to `Lua+LuaInterface`, then restart EmuHawk. (If you're using BizHawk 2.9, you can skip this step.) +- Under `Config > Customize`, check the "Run in background" option to prevent disconnecting from the client while you're +tabbed out of EmuHawk. +- Open a `.gba` file in EmuHawk and go to `Config > Controllers…` to configure your inputs. If you can't click +`Controllers…`, load any `.gba` ROM first. +- Consider clearing keybinds in `Config > Hotkeys…` if you don't intend to use them. Select the keybind and press Esc to +clear it. + +## Optional Software + +- [Pokémon Emerald AP Tracker](https://github.com/AliceMousie/emerald-ap-tracker/releases/latest), for use with +[PopTracker](https://github.com/black-sliver/PopTracker/releases) + +## Generating and Patching a Game + +1. Create your settings file (YAML). You can make one on the +[Pokémon Emerald settings page](../../../games/Pokemon%20Emerald/player-settings). +2. Follow the general Archipelago instructions for [generating a game](../../Archipelago/setup/en#generating-a-game). +This will generate an output file for you. Your patch file will have the `.apemerald` file extension. +3. Open `ArchipelagoLauncher.exe` +4. Select "Open Patch" on the left side and select your patch file. +5. If this is your first time patching, you will be prompted to locate your vanilla ROM. +6. A patched `.gba` file will be created in the same place as the patch file. +7. On your first time opening a patch with BizHawk Client, you will also be asked to locate `EmuHawk.exe` in your +BizHawk install. + +If you're playing a single-player seed and you don't care about autotracking or hints, you can stop here, close the +client, and load the patched ROM in any emulator. However, for multiworlds and other Archipelago features, continue +below using BizHawk as your emulator. + +## Connecting to a Server + +By default, opening a patch file will do steps 1-5 below for you automatically. Even so, keep them in your memory just +in case you have to close and reopen a window mid-game for some reason. + +1. Pokemon Emerald uses Archipelago's BizHawk Client. If the client isn't still open from when you patched your game, +you can re-open it from the launcher. +2. Ensure EmuHawk is running the patched ROM. +3. In EmuHawk, go to `Tools > Lua Console`. This window must stay open while playing. +4. In the Lua Console window, go to `Script > Open Script…`. +5. Navigate to your Archipelago install folder and open `data/lua/connector_bizhawk_generic.lua`. +6. The emulator may freeze every few seconds until it manages to connect to the client. This is expected. The BizHawk +Client window should indicate that it connected and recognized Pokemon Emerald. +7. To connect the client to the server, enter your room's address and port (e.g. `archipelago.gg:38281`) into the +top text field of the client and click Connect. + +You should now be able to receive and send items. You'll need to do these steps every time you want to reconnect. It is +perfectly safe to make progress offline; everything will re-sync when you reconnect. + +## Auto-Tracking + +Pokémon Emerald has a fully functional map tracker that supports auto-tracking. + +1. Download [Pokémon Emerald AP Tracker](https://github.com/AliceMousie/emerald-ap-tracker/releases/latest) and +[PopTracker](https://github.com/black-sliver/PopTracker/releases). +2. Put the tracker pack into packs/ in your PopTracker install. +3. Open PopTracker, and load the Pokémon Emerald pack. +4. For autotracking, click on the "AP" symbol at the top. +5. Enter the Archipelago server address (the one you connected your client to), slot name, and password. diff --git a/worlds/pokemon_emerald/items.py b/worlds/pokemon_emerald/items.py new file mode 100644 index 000000000000..7963f92384ac --- /dev/null +++ b/worlds/pokemon_emerald/items.py @@ -0,0 +1,77 @@ +""" +Classes and functions related to AP items for Pokemon Emerald +""" +from typing import Dict, FrozenSet, Optional + +from BaseClasses import Item, ItemClassification + +from .data import BASE_OFFSET, data + + +class PokemonEmeraldItem(Item): + game: str = "Pokemon Emerald" + tags: FrozenSet[str] + + def __init__(self, name: str, classification: ItemClassification, code: Optional[int], player: int) -> None: + super().__init__(name, classification, code, player) + + if code is None: + self.tags = frozenset(["Event"]) + else: + self.tags = data.items[reverse_offset_item_value(code)].tags + + +def offset_item_value(item_value: int) -> int: + """ + Returns the AP item id (code) for a given item value + """ + return item_value + BASE_OFFSET + + +def reverse_offset_item_value(item_id: int) -> int: + """ + Returns the item value for a given AP item id (code) + """ + return item_id - BASE_OFFSET + + +def create_item_label_to_code_map() -> Dict[str, int]: + """ + Creates a map from item labels to their AP item id (code) + """ + label_to_code_map: Dict[str, int] = {} + for item_value, attributes in data.items.items(): + label_to_code_map[attributes.label] = offset_item_value(item_value) + + return label_to_code_map + + +ITEM_GROUPS = { + "Badges": { + "Stone Badge", "Knuckle Badge", + "Dynamo Badge", "Heat Badge", + "Balance Badge", "Feather Badge", + "Mind Badge", "Rain Badge" + }, + "HMs": { + "HM01 Cut", "HM02 Fly", + "HM03 Surf", "HM04 Strength", + "HM05 Flash", "HM06 Rock Smash", + "HM07 Waterfall", "HM08 Dive" + }, + "HM01": {"HM01 Cut"}, + "HM02": {"HM02 Fly"}, + "HM03": {"HM03 Surf"}, + "HM04": {"HM04 Strength"}, + "HM05": {"HM05 Flash"}, + "HM06": {"HM06 Rock Smash"}, + "HM07": {"HM07 Waterfall"}, + "HM08": {"HM08 Dive"} +} + + +def get_item_classification(item_code: int) -> ItemClassification: + """ + Returns the item classification for a given AP item id (code) + """ + return data.items[reverse_offset_item_value(item_code)].classification diff --git a/worlds/pokemon_emerald/locations.py b/worlds/pokemon_emerald/locations.py new file mode 100644 index 000000000000..bfe5be754585 --- /dev/null +++ b/worlds/pokemon_emerald/locations.py @@ -0,0 +1,122 @@ +""" +Classes and functions related to AP locations for Pokemon Emerald +""" +from typing import TYPE_CHECKING, Dict, List, Optional, FrozenSet, Iterable + +from BaseClasses import Location, Region + +from .data import BASE_OFFSET, data +from .items import offset_item_value + +if TYPE_CHECKING: + from . import PokemonEmeraldWorld + + +class PokemonEmeraldLocation(Location): + game: str = "Pokemon Emerald" + rom_address: Optional[int] + default_item_code: Optional[int] + tags: FrozenSet[str] + + def __init__( + self, + player: int, + name: str, + flag: Optional[int], + parent: Optional[Region] = None, + rom_address: Optional[int] = None, + default_item_value: Optional[int] = None, + tags: FrozenSet[str] = frozenset()) -> None: + super().__init__(player, name, None if flag is None else offset_flag(flag), parent) + self.default_item_code = None if default_item_value is None else offset_item_value(default_item_value) + self.rom_address = rom_address + self.tags = tags + + +def offset_flag(flag: int) -> int: + """ + Returns the AP location id (address) for a given flag + """ + if flag is None: + return None + return flag + BASE_OFFSET + + +def reverse_offset_flag(location_id: int) -> int: + """ + Returns the flag id for a given AP location id (address) + """ + if location_id is None: + return None + return location_id - BASE_OFFSET + + +def create_locations_with_tags(world: "PokemonEmeraldWorld", regions: Dict[str, Region], tags: Iterable[str]) -> None: + """ + Iterates through region data and adds locations to the multiworld if + those locations include any of the provided tags. + """ + tags = set(tags) + + for region_name, region_data in data.regions.items(): + region = regions[region_name] + filtered_locations = [loc for loc in region_data.locations if len(tags & data.locations[loc].tags) > 0] + + for location_name in filtered_locations: + location_data = data.locations[location_name] + location = PokemonEmeraldLocation( + world.player, + location_data.label, + location_data.flag, + region, + location_data.rom_address, + location_data.default_item, + location_data.tags + ) + region.locations.append(location) + + +def create_location_label_to_id_map() -> Dict[str, int]: + """ + Creates a map from location labels to their AP location id (address) + """ + label_to_id_map: Dict[str, int] = {} + for region_data in data.regions.values(): + for location_name in region_data.locations: + location_data = data.locations[location_name] + label_to_id_map[location_data.label] = offset_flag(location_data.flag) + + return label_to_id_map + + +LOCATION_GROUPS = { + "Badges": { + "Rustboro Gym - Stone Badge", + "Dewford Gym - Knuckle Badge", + "Mauville Gym - Dynamo Badge", + "Lavaridge Gym - Heat Badge", + "Petalburg Gym - Balance Badge", + "Fortree Gym - Feather Badge", + "Mossdeep Gym - Mind Badge", + "Sootopolis Gym - Rain Badge", + }, + "Gym TMs": { + "Rustboro Gym - TM39 from Roxanne", + "Dewford Gym - TM08 from Brawly", + "Mauville Gym - TM34 from Wattson", + "Lavaridge Gym - TM50 from Flannery", + "Petalburg Gym - TM42 from Norman", + "Fortree Gym - TM40 from Winona", + "Mossdeep Gym - TM04 from Tate and Liza", + "Sootopolis Gym - TM03 from Juan", + }, + "Postgame Locations": { + "Littleroot Town - S.S. Ticket from Norman", + "SS Tidal - Hidden Item in Lower Deck Trash Can", + "SS Tidal - TM49 from Thief", + "Safari Zone NE - Hidden Item North", + "Safari Zone NE - Hidden Item East", + "Safari Zone SE - Hidden Item in South Grass 1", + "Safari Zone SE - Hidden Item in South Grass 2", + } +} diff --git a/worlds/pokemon_emerald/options.py b/worlds/pokemon_emerald/options.py new file mode 100644 index 000000000000..655966a2a7b7 --- /dev/null +++ b/worlds/pokemon_emerald/options.py @@ -0,0 +1,606 @@ +""" +Option definitions for Pokemon Emerald +""" +from dataclasses import dataclass +from typing import Dict, Type + +from Options import Choice, DefaultOnToggle, Option, OptionSet, Range, Toggle, FreeText, PerGameCommonOptions + +from .data import data + + +class Goal(Choice): + """ + Determines what your goal is to consider the game beaten + + Champion: Become the champion and enter the hall of fame + Steven: Defeat Steven in Meteor Falls + Norman: Defeat Norman in Petalburg Gym + """ + display_name = "Goal" + default = 0 + option_champion = 0 + option_steven = 1 + option_norman = 2 + + +class RandomizeBadges(Choice): + """ + Adds Badges to the pool + + Vanilla: Gym leaders give their own badge + Shuffle: Gym leaders give a random badge + Completely Random: Badges can be found anywhere + """ + display_name = "Randomize Badges" + default = 2 + option_vanilla = 0 + option_shuffle = 1 + option_completely_random = 2 + + +class RandomizeHms(Choice): + """ + Adds HMs to the pool + + Vanilla: HMs are at their vanilla locations + Shuffle: HMs are shuffled among vanilla HM locations + Completely Random: HMs can be found anywhere + """ + display_name = "Randomize HMs" + default = 2 + option_vanilla = 0 + option_shuffle = 1 + option_completely_random = 2 + + +class RandomizeKeyItems(DefaultOnToggle): + """ + Adds most key items to the pool. These are usually required to unlock + a location or region (e.g. Devon Scope, Letter, Basement Key) + """ + display_name = "Randomize Key Items" + + +class RandomizeBikes(Toggle): + """ + Adds the mach bike and acro bike to the pool + """ + display_name = "Randomize Bikes" + + +class RandomizeRods(Toggle): + """ + Adds fishing rods to the pool + """ + display_name = "Randomize Fishing Rods" + + +class RandomizeOverworldItems(DefaultOnToggle): + """ + Adds items on the ground with a Pokeball sprite to the pool + """ + display_name = "Randomize Overworld Items" + + +class RandomizeHiddenItems(Toggle): + """ + Adds hidden items to the pool + """ + display_name = "Randomize Hidden Items" + + +class RandomizeNpcGifts(Toggle): + """ + Adds most gifts received from NPCs to the pool (not including key items or HMs) + """ + display_name = "Randomize NPC Gifts" + + +class ItemPoolType(Choice): + """ + Determines which non-progression items get put into the item pool + + Shuffled: Item pool consists of shuffled vanilla items + Diverse Balanced: Item pool consists of random items approximately proportioned + according to what they're replacing (i.e. more pokeballs, fewer X items, etc...) + Diverse: Item pool consists of uniformly random (non-unique) items + """ + display_name = "Item Pool Type" + default = 0 + option_shuffled = 0 + option_diverse_balanced = 1 + option_diverse = 2 + + +class HiddenItemsRequireItemfinder(DefaultOnToggle): + """ + The Itemfinder is logically required to pick up hidden items + """ + display_name = "Require Itemfinder" + + +class DarkCavesRequireFlash(DefaultOnToggle): + """ + The lower floors of Granite Cave and Victory Road logically require use of HM05 Flash + """ + display_name = "Require Flash" + + +class EnableFerry(Toggle): + """ + The ferry between Slateport, Lilycove, and the Battle Frontier can be used if you have the S.S. Ticket + """ + display_name = "Enable Ferry" + + +class EliteFourRequirement(Choice): + """ + Sets the requirements to challenge the elite four + + Badges: Obtain some number of badges + Gyms: Defeat some number of gyms + """ + display_name = "Elite Four Requirement" + default = 0 + option_badges = 0 + option_gyms = 1 + + +class EliteFourCount(Range): + """ + Sets the number of badges/gyms required to challenge the elite four + """ + display_name = "Elite Four Count" + range_start = 0 + range_end = 8 + default = 8 + + +class NormanRequirement(Choice): + """ + Sets the requirements to challenge the Petalburg Gym + + Badges: Obtain some number of badges + Gyms: Defeat some number of gyms + """ + display_name = "Norman Requirement" + default = 0 + option_badges = 0 + option_gyms = 1 + + +class NormanCount(Range): + """ + Sets the number of badges/gyms required to challenge the Petalburg Gym + """ + display_name = "Norman Count" + range_start = 0 + range_end = 7 + default = 4 + + +class RandomizeWildPokemon(Choice): + """ + Randomizes wild pokemon encounters (grass, caves, water, fishing) + + Vanilla: Wild encounters are unchanged + Match Base Stats: Wild pokemon are replaced with species with approximately the same bst + Match Type: Wild pokemon are replaced with species that share a type with the original + Match Base Stats and Type: Apply both Match Base Stats and Match Type + Completely Random: There are no restrictions + """ + display_name = "Randomize Wild Pokemon" + default = 0 + option_vanilla = 0 + option_match_base_stats = 1 + option_match_type = 2 + option_match_base_stats_and_type = 3 + option_completely_random = 4 + + +class AllowWildLegendaries(DefaultOnToggle): + """ + Wild encounters can be replaced by legendaries. Only applied if Randomize Wild Pokemon is not Vanilla. + """ + display_name = "Allow Wild Legendaries" + + +class RandomizeStarters(Choice): + """ + Randomizes the starter pokemon in Professor Birch's bag + + Vanilla: Starters are unchanged + Match Base Stats: Starters are replaced with species with approximately the same bst + Match Type: Starters are replaced with species that share a type with the original + Match Base Stats and Type: Apply both Match Base Stats and Match Type + Completely Random: There are no restrictions + """ + display_name = "Randomize Starters" + default = 0 + option_vanilla = 0 + option_match_base_stats = 1 + option_match_type = 2 + option_match_base_stats_and_type = 3 + option_completely_random = 4 + + +class AllowStarterLegendaries(DefaultOnToggle): + """ + Starters can be replaced by legendaries. Only applied if Randomize Starters is not Vanilla. + """ + display_name = "Allow Starter Legendaries" + + +class RandomizeTrainerParties(Choice): + """ + Randomizes the parties of all trainers. + + Vanilla: Parties are unchanged + Match Base Stats: Trainer pokemon are replaced with species with approximately the same bst + Match Type: Trainer pokemon are replaced with species that share a type with the original + Match Base Stats and Type: Apply both Match Base Stats and Match Type + Completely Random: There are no restrictions + """ + display_name = "Randomize Trainer Parties" + default = 0 + option_vanilla = 0 + option_match_base_stats = 1 + option_match_type = 2 + option_match_base_stats_and_type = 3 + option_completely_random = 4 + + +class AllowTrainerLegendaries(DefaultOnToggle): + """ + Enemy trainer pokemon can be replaced by legendaries. Only applied if Randomize Trainer Parties is not Vanilla. + """ + display_name = "Allow Trainer Legendaries" + + +class RandomizeStaticEncounters(Choice): + """ + Randomizes static encounters (Rayquaza, hidden Kekleons, fake Voltorb pokeballs, etc...) + + Vanilla: Static encounters are unchanged + Shuffle: Static encounters are shuffled between each other + Match Base Stats: Static encounters are replaced with species with approximately the same bst + Match Type: Static encounters are replaced with species that share a type with the original + Match Base Stats and Type: Apply both Match Base Stats and Match Type + Completely Random: There are no restrictions + """ + display_name = "Randomize Static Encounters" + default = 0 + option_vanilla = 0 + option_shuffle = 1 + option_match_base_stats = 2 + option_match_type = 3 + option_match_base_stats_and_type = 4 + option_completely_random = 5 + + +class RandomizeTypes(Choice): + """ + Randomizes the type(s) of every pokemon. Each species will have the same number of types. + + Vanilla: Types are unchanged + Shuffle: Types are shuffled globally for all species (e.g. every Water-type pokemon becomes Fire-type) + Completely Random: Each species has its type(s) randomized + Follow Evolutions: Types are randomized per evolution line instead of per species + """ + display_name = "Randomize Types" + default = 0 + option_vanilla = 0 + option_shuffle = 1 + option_completely_random = 2 + option_follow_evolutions = 3 + + +class RandomizeAbilities(Choice): + """ + Randomizes abilities of every species. Each species will have the same number of abilities. + + Vanilla: Abilities are unchanged + Completely Random: Each species has its abilities randomized + Follow Evolutions: Abilities are randomized, but if a pokemon would normally retain its ability + when evolving, the random ability will also be retained + """ + display_name = "Randomize Abilities" + default = 0 + option_vanilla = 0 + option_completely_random = 1 + option_follow_evolutions = 2 + + +class AbilityBlacklist(OptionSet): + """ + A list of abilities which no pokemon should have if abilities are randomized. + For example, you could exclude Wonder Guard and Arena Trap like this: + ["Wonder Guard", "Arena Trap"] + """ + display_name = "Ability Blacklist" + valid_keys = frozenset([ability.label for ability in data.abilities]) + + +class LevelUpMoves(Choice): + """ + Randomizes the moves a pokemon learns when they reach a level where they would learn a move. + Your starter is guaranteed to have a usable damaging move. + + Vanilla: Learnset is unchanged + Randomized: Moves are randomized + Start with Four Moves: Moves are randomized and all Pokemon know 4 moves at level 1 + """ + display_name = "Level Up Moves" + default = 0 + option_vanilla = 0 + option_randomized = 1 + option_start_with_four_moves = 2 + + +class MoveMatchTypeBias(Range): + """ + Sets the probability that a learned move will be forced match one of the types of a pokemon. + + If a move is not forced to match type, it will roll for Normal type bias. + """ + display_name = "Move Match Type Bias" + range_start = 0 + range_end = 100 + default = 0 + + +class MoveNormalTypeBias(Range): + """ + After it has been decided that a move will not be forced to match types, sets the probability that a learned move + will be forced to be the Normal type. + + If a move is not forced to be Normal, it will be completely random. + """ + display_name = "Move Normal Type Bias" + range_start = 0 + range_end = 100 + default = 0 + + +class HmCompatibility(Choice): + """ + Modifies the compatibility of HMs + + Vanilla: Compatibility is unchanged + Fully Compatible: Every species can learn any HM + Completely Random: Compatibility is 50/50 for every HM (does not remain consistent across evolution) + """ + display_name = "HM Compatibility" + default = 1 + option_vanilla = 0 + option_fully_compatible = 1 + option_completely_random = 2 + + +class TmCompatibility(Choice): + """ + Modifies the compatibility of TMs + + Vanilla: Compatibility is unchanged + Fully Compatible: Every species can learn any TM + Completely Random: Compatibility is 50/50 for every TM (does not remain consistent across evolution) + """ + display_name = "TM Compatibility" + default = 0 + option_vanilla = 0 + option_fully_compatible = 1 + option_completely_random = 2 + + +class TmMoves(Toggle): + """ + Randomizes the moves taught by TMs + """ + display_name = "TM Moves" + + +class ReusableTms(Toggle): + """ + Sets TMs to not break after use (they remain sellable) + """ + display_name = "Reusable TMs" + + +class MinCatchRate(Range): + """ + Sets the minimum catch rate a pokemon can have. Any pokemon with a catch rate below this floor will have it raised to this value. + + Legendaries are often in the single digits + Fully evolved pokemon are often double digits + Pidgey is 255 + """ + display_name = "Minimum Catch Rate" + range_start = 3 + range_end = 255 + default = 3 + + +class GuaranteedCatch(Toggle): + """ + Every throw is guaranteed to catch a wild pokemon + """ + display_name = "Guaranteed Catch" + + +class ExpModifier(Range): + """ + Multiplies gained experience by a percentage + + 100 is default + 50 is half + 200 is double + etc... + """ + display_name = "Exp Modifier" + range_start = 0 + range_end = 1000 + default = 100 + + +class BlindTrainers(Toggle): + """ + Causes trainers to not start a battle with you unless you talk to them + """ + display_name = "Blind Trainers" + + +class DoubleBattleChance(Range): + """ + The percent chance that a trainer with more than 1 pokemon will be converted into a double battle. + If these trainers would normally approach you, they will only do so if you have 2 unfainted pokemon. + They can be battled by talking to them no matter what. + """ + display_name = "Double Battle Chance" + range_start = 0 + range_end = 100 + default = 0 + + +class BetterShops(Toggle): + """ + Pokemarts sell every item that can be obtained in a pokemart (except mail, which is still unique to the relevant city) + """ + display_name = "Better Shops" + + +class RemoveRoadblocks(OptionSet): + """ + Removes specific NPCs that normally stand in your way until certain events are completed. + + This can open up the world a bit and make your playthrough less linear, but careful how many you remove; it may make too much of your world accessible upon receiving Surf. + + Possible values are: + "Route 110 Aqua Grunts" + "Route 112 Magma Grunts" + "Route 119 Aqua Grunts" + "Safari Zone Construction Workers" + "Lilycove City Wailmer" + "Aqua Hideout Grunts" + "Seafloor Cavern Aqua Grunt" + """ + display_name = "Remove Roadblocks" + valid_keys = frozenset([ + "Route 110 Aqua Grunts", + "Route 112 Magma Grunts", + "Route 119 Aqua Grunts", + "Safari Zone Construction Workers", + "Lilycove City Wailmer", + "Aqua Hideout Grunts", + "Seafloor Cavern Aqua Grunt" + ]) + + +class ExtraBoulders(Toggle): + """ + Places strength boulders on Route 115 which block access to Meteor Falls from the beach. + This aims to take some power away from Surf as a tool for access. + """ + display_name = "Extra Boulders" + + +class FreeFlyLocation(Toggle): + """ + Enables flying to one random location when Mom gives you the running shoes (excluding cities reachable with no items) + """ + display_name = "Free Fly Location" + + +class FlyWithoutBadge(DefaultOnToggle): + """ + Fly does not require the Feather Badge to use in the field + """ + display_name = "Fly Without Badge" + + +class TurboA(Toggle): + """ + Holding A will advance most text automatically + """ + display_name = "Turbo A" + + +class ReceiveItemMessages(Choice): + """ + Determines whether you receive an in-game notification when receiving an item. Items can still only be received in the overworld. + + All: Every item shows a message + Progression: Only progression items show a message + None: All items are added to your bag silently (badges will still show) + """ + display_name = "Receive Item Messages" + default = 0 + option_all = 0 + option_progression = 1 + option_none = 2 + + +class EasterEgg(FreeText): + """ + ??? + """ + default = "Example Passphrase" + + +@dataclass +class PokemonEmeraldOptions(PerGameCommonOptions): + goal: Goal + + badges: RandomizeBadges + hms: RandomizeHms + key_items: RandomizeKeyItems + bikes: RandomizeBikes + rods: RandomizeRods + overworld_items: RandomizeOverworldItems + hidden_items: RandomizeHiddenItems + npc_gifts: RandomizeNpcGifts + item_pool_type: ItemPoolType + + require_itemfinder: HiddenItemsRequireItemfinder + require_flash: DarkCavesRequireFlash + elite_four_requirement: EliteFourRequirement + elite_four_count: EliteFourCount + norman_requirement: NormanRequirement + norman_count: NormanCount + + wild_pokemon: RandomizeWildPokemon + allow_wild_legendaries: AllowWildLegendaries + starters: RandomizeStarters + allow_starter_legendaries: AllowStarterLegendaries + trainer_parties: RandomizeTrainerParties + allow_trainer_legendaries: AllowTrainerLegendaries + static_encounters: RandomizeStaticEncounters + types: RandomizeTypes + abilities: RandomizeAbilities + ability_blacklist: AbilityBlacklist + + level_up_moves: LevelUpMoves + move_match_type_bias: MoveMatchTypeBias + move_normal_type_bias: MoveNormalTypeBias + tm_compatibility: TmCompatibility + hm_compatibility: HmCompatibility + tm_moves: TmMoves + reusable_tms: ReusableTms + + min_catch_rate: MinCatchRate + guaranteed_catch: GuaranteedCatch + exp_modifier: ExpModifier + blind_trainers: BlindTrainers + double_battle_chance: DoubleBattleChance + better_shops: BetterShops + + enable_ferry: EnableFerry + remove_roadblocks: RemoveRoadblocks + extra_boulders: ExtraBoulders + free_fly_location: FreeFlyLocation + fly_without_badge: FlyWithoutBadge + + turbo_a: TurboA + receive_item_messages: ReceiveItemMessages + + easter_egg: EasterEgg diff --git a/worlds/pokemon_emerald/pokemon.py b/worlds/pokemon_emerald/pokemon.py new file mode 100644 index 000000000000..b461d006a46f --- /dev/null +++ b/worlds/pokemon_emerald/pokemon.py @@ -0,0 +1,196 @@ +""" +Functions related to pokemon species and moves +""" +import time +from typing import TYPE_CHECKING, Dict, List, Set, Optional, Tuple + +from .data import SpeciesData, data + +if TYPE_CHECKING: + from random import Random + + +_damaging_moves = frozenset({ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, + 16, 17, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, + 31, 33, 34, 35, 36, 37, 38, 40, 41, 42, 44, 51, + 52, 53, 55, 56, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 69, 71, 72, 75, 76, 80, 82, 83, 84, 85, + 87, 88, 89, 91, 93, 94, 98, 99, 101, 121, 122, 123, + 124, 125, 126, 128, 129, 130, 131, 132, 136, 140, 141, 143, + 145, 146, 149, 152, 154, 155, 157, 158, 161, 162, 163, 167, + 168, 172, 175, 177, 179, 181, 183, 185, 188, 189, 190, 192, + 196, 198, 200, 202, 205, 209, 210, 211, 216, 217, 218, 221, + 222, 223, 224, 225, 228, 229, 231, 232, 233, 237, 238, 239, + 242, 245, 246, 247, 248, 250, 251, 253, 257, 263, 265, 267, + 276, 279, 280, 282, 284, 290, 292, 295, 296, 299, 301, 302, + 304, 305, 306, 307, 308, 309, 310, 311, 314, 315, 317, 318, + 323, 324, 325, 326, 327, 328, 330, 331, 332, 333, 337, 338, + 340, 341, 342, 343, 344, 345, 348, 350, 351, 352, 353, 354 +}) + +_move_types = [ + 0, 0, 1, 0, 0, 0, 0, 10, 15, 13, 0, 0, 0, 0, 0, + 0, 2, 2, 0, 2, 0, 0, 12, 0, 1, 0, 1, 1, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 6, 0, 17, + 0, 0, 0, 0, 0, 0, 3, 10, 10, 15, 11, 11, 11, 15, 15, + 14, 11, 15, 0, 2, 2, 1, 1, 1, 1, 0, 12, 12, 12, 0, + 12, 12, 3, 12, 12, 12, 6, 16, 10, 13, 13, 13, 13, 5, 4, + 4, 4, 3, 14, 14, 14, 14, 14, 0, 0, 14, 7, 0, 0, 0, + 0, 0, 0, 0, 7, 11, 0, 14, 14, 15, 14, 0, 0, 0, 2, + 0, 0, 7, 3, 3, 4, 10, 11, 11, 0, 0, 0, 0, 14, 14, + 0, 1, 0, 14, 3, 0, 6, 0, 2, 0, 11, 0, 12, 0, 14, + 0, 3, 11, 0, 0, 4, 14, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 17, 6, 0, 7, 10, 0, 9, 0, 0, 2, 12, 1, + 7, 15, 0, 1, 0, 17, 0, 0, 3, 4, 11, 4, 13, 0, 7, + 0, 15, 1, 4, 0, 16, 5, 12, 0, 0, 5, 0, 0, 0, 13, + 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 4, 1, 6, + 16, 0, 0, 17, 0, 0, 8, 8, 1, 0, 12, 0, 0, 1, 16, + 11, 10, 17, 14, 0, 0, 5, 7, 14, 1, 11, 17, 0, 0, 0, + 0, 0, 10, 15, 17, 17, 10, 17, 0, 1, 0, 0, 0, 13, 17, + 0, 14, 14, 0, 0, 12, 1, 14, 0, 1, 1, 0, 17, 0, 10, + 14, 14, 0, 7, 17, 0, 11, 1, 0, 6, 14, 14, 2, 0, 10, + 4, 15, 12, 0, 0, 3, 0, 10, 11, 8, 7, 0, 12, 17, 2, + 10, 0, 5, 6, 8, 12, 0, 14, 11, 6, 7, 14, 1, 4, 15, + 11, 12, 2, 15, 8, 0, 0, 16, 12, 1, 2, 4, 3, 0, 13, + 12, 11, 14, 12, 16, 5, 13, 11, 8, 14 +] + +_moves_by_type: Dict[int, List[int]] = {} +for move, type in enumerate(_move_types): + _moves_by_type.setdefault(type, []).append(move) + +_move_blacklist = frozenset({ + 0, # MOVE_NONE + 165, # Struggle + 15, # Cut + 148, # Flash + 249, # Rock Smash + 70, # Strength + 57, # Surf + 19, # Fly + 291, # Dive + 127 # Waterfall +}) + +_legendary_pokemon = frozenset({ + 'Mew', + 'Mewtwo', + 'Articuno', + 'Zapdos', + 'Moltres', + 'Lugia', + 'Ho-oh', + 'Raikou', + 'Suicune', + 'Entei', + 'Celebi', + 'Groudon', + 'Kyogre', + 'Rayquaza', + 'Latios', + 'Latias', + 'Registeel', + 'Regirock', + 'Regice', + 'Jirachi', + 'Deoxys' +}) + + +def get_random_species( + random: "Random", + candidates: List[Optional[SpeciesData]], + nearby_bst: Optional[int] = None, + species_type: Optional[int] = None, + allow_legendaries: bool = True) -> SpeciesData: + candidates: List[SpeciesData] = [species for species in candidates if species is not None] + + if species_type is not None: + candidates = [species for species in candidates if species_type in species.types] + + if not allow_legendaries: + candidates = [species for species in candidates if species.label not in _legendary_pokemon] + + if nearby_bst is not None: + def has_nearby_bst(species: SpeciesData, max_percent_different: int) -> bool: + return abs(sum(species.base_stats) - nearby_bst) < nearby_bst * (max_percent_different / 100) + + max_percent_different = 10 + bst_filtered_candidates = [species for species in candidates if has_nearby_bst(species, max_percent_different)] + while len(bst_filtered_candidates) == 0: + max_percent_different += 10 + bst_filtered_candidates = [ + species + for species in candidates + if has_nearby_bst(species, max_percent_different) + ] + + candidates = bst_filtered_candidates + + return random.choice(candidates) + + +def get_random_type(random: "Random") -> int: + picked_type = random.randrange(0, 18) + while picked_type == 9: # Don't pick the ??? type + picked_type = random.randrange(0, 18) + + return picked_type + + +def get_random_move( + random: "Random", + blacklist: Optional[Set[int]] = None, + type_bias: int = 0, + normal_bias: int = 0, + type_target: Optional[Tuple[int, int]] = None) -> int: + expanded_blacklist = _move_blacklist | (blacklist if blacklist is not None else set()) + + bias = random.random() * 100 + if bias < type_bias: + pass # Keep type_target unchanged + elif bias < type_bias + ((100 - type_bias) * (normal_bias / 100)): + type_target = (0, 0) + else: + type_target = None + + chosen_move = None + + # The blacklist is relatively small, so if we don't need to restrict + # ourselves to any particular types, it's usually much faster to pick + # a random number and hope it works. Limit this to 5 tries in case the + # blacklist is actually significant enough to make this unlikely to work. + if type_target is None: + remaining_attempts = 5 + while remaining_attempts > 0: + remaining_attempts -= 1 + chosen_move = random.randrange(0, data.constants["MOVES_COUNT"]) + if chosen_move not in expanded_blacklist: + return chosen_move + else: + chosen_move = None + + # We're either matching types or failed to pick a move above + if type_target is None: + possible_moves = [i for i in range(data.constants["MOVE_COUNT"]) if i not in expanded_blacklist] + else: + possible_moves = [move for move in _moves_by_type[type_target[0]] if move not in expanded_blacklist] + \ + [move for move in _moves_by_type[type_target[1]] if move not in expanded_blacklist] + + if len(possible_moves) == 0: + return get_random_move(random, None, type_bias, normal_bias, type_target) + + return random.choice(possible_moves) + + +def get_random_damaging_move(random: "Random", blacklist: Optional[Set[int]] = None) -> int: + expanded_blacklist = _move_blacklist | (blacklist if blacklist is not None else set()) + + move_options = list(_damaging_moves) + + move = random.choice(move_options) + while move in expanded_blacklist: + move = random.choice(move_options) + + return move diff --git a/worlds/pokemon_emerald/regions.py b/worlds/pokemon_emerald/regions.py new file mode 100644 index 000000000000..e8f6d26e08ce --- /dev/null +++ b/worlds/pokemon_emerald/regions.py @@ -0,0 +1,49 @@ +""" +Functions related to AP regions for Pokemon Emerald (see ./data/regions for region definitions) +""" +from typing import TYPE_CHECKING, Dict, List, Tuple + +from BaseClasses import ItemClassification, Region + +from .data import data +from .items import PokemonEmeraldItem +from .locations import PokemonEmeraldLocation + +if TYPE_CHECKING: + from . import PokemonEmeraldWorld + + +def create_regions(world: "PokemonEmeraldWorld") -> Dict[str, Region]: + """ + Iterates through regions created from JSON to create regions and adds them to the multiworld. + Also creates and places events and connects regions via warps and the exits defined in the JSON. + """ + regions: Dict[str, Region] = {} + connections: List[Tuple[str, str, str]] = [] + + for region_name, region_data in data.regions.items(): + new_region = Region(region_name, world.player, world.multiworld) + + for event_data in region_data.events: + event = PokemonEmeraldLocation(world.player, event_data.name, None, new_region) + event.place_locked_item(PokemonEmeraldItem(event_data.name, ItemClassification.progression, None, world.player)) + new_region.locations.append(event) + + for region_exit in region_data.exits: + connections.append((f"{region_name} -> {region_exit}", region_name, region_exit)) + + for warp in region_data.warps: + dest_warp = data.warps[data.warp_map[warp]] + if dest_warp.parent_region is None: + continue + connections.append((warp, region_name, dest_warp.parent_region)) + + regions[region_name] = new_region + + for name, source, dest in connections: + regions[source].connect(regions[dest], name) + + regions["Menu"] = Region("Menu", world.player, world.multiworld) + regions["Menu"].connect(regions["REGION_LITTLEROOT_TOWN/MAIN"], "Start Game") + + return regions diff --git a/worlds/pokemon_emerald/rom.py b/worlds/pokemon_emerald/rom.py new file mode 100644 index 000000000000..156410553cf6 --- /dev/null +++ b/worlds/pokemon_emerald/rom.py @@ -0,0 +1,420 @@ +""" +Classes and functions related to creating a ROM patch +""" +import os +import pkgutil +from typing import TYPE_CHECKING, List, Tuple + +import bsdiff4 + +from worlds.Files import APDeltaPatch +from settings import get_settings + +from .data import PokemonEmeraldData, TrainerPokemonDataTypeEnum, data +from .items import reverse_offset_item_value +from .options import RandomizeWildPokemon, RandomizeTrainerParties, EliteFourRequirement, NormanRequirement +from .pokemon import get_random_species + +if TYPE_CHECKING: + from . import PokemonEmeraldWorld + + +class PokemonEmeraldDeltaPatch(APDeltaPatch): + game = "Pokemon Emerald" + hash = "605b89b67018abcea91e693a4dd25be3" + patch_file_ending = ".apemerald" + result_file_ending = ".gba" + + @classmethod + def get_source_data(cls) -> bytes: + return get_base_rom_as_bytes() + + +location_visited_event_to_id_map = { + "EVENT_VISITED_LITTLEROOT_TOWN": 0, + "EVENT_VISITED_OLDALE_TOWN": 1, + "EVENT_VISITED_PETALBURG_CITY": 2, + "EVENT_VISITED_RUSTBORO_CITY": 3, + "EVENT_VISITED_DEWFORD_TOWN": 4, + "EVENT_VISITED_SLATEPORT_CITY": 5, + "EVENT_VISITED_MAUVILLE_CITY": 6, + "EVENT_VISITED_VERDANTURF_TOWN": 7, + "EVENT_VISITED_FALLARBOR_TOWN": 8, + "EVENT_VISITED_LAVARIDGE_TOWN": 9, + "EVENT_VISITED_FORTREE_CITY": 10, + "EVENT_VISITED_LILYCOVE_CITY": 11, + "EVENT_VISITED_MOSSDEEP_CITY": 12, + "EVENT_VISITED_SOOTOPOLIS_CITY": 13, + "EVENT_VISITED_PACIFIDLOG_TOWN": 14, + "EVENT_VISITED_EVER_GRANDE_CITY": 15, + "EVENT_VISITED_BATTLE_FRONTIER": 16, + "EVENT_VISITED_SOUTHERN_ISLAND": 17 +} + + +def generate_output(world: "PokemonEmeraldWorld", output_directory: str) -> None: + base_rom = get_base_rom_as_bytes() + base_patch = pkgutil.get_data(__name__, "data/base_patch.bsdiff4") + patched_rom = bytearray(bsdiff4.patch(base_rom, base_patch)) + + # Set item values + for location in world.multiworld.get_locations(world.player): + # Set free fly location + if location.address is None: + if world.options.free_fly_location and location.name == "EVENT_VISITED_LITTLEROOT_TOWN": + _set_bytes_little_endian( + patched_rom, + data.rom_addresses["gArchipelagoOptions"] + 0x16, + 1, + world.free_fly_location_id + ) + continue + + if location.item and location.item.player == world.player: + _set_bytes_little_endian( + patched_rom, + location.rom_address, + 2, + reverse_offset_item_value(location.item.code) + ) + else: + _set_bytes_little_endian( + patched_rom, + location.rom_address, + 2, + data.constants["ITEM_ARCHIPELAGO_PROGRESSION"] + ) + + # Set start inventory + start_inventory = world.options.start_inventory.value.copy() + + starting_badges = 0 + if start_inventory.pop("Stone Badge", 0) > 0: + starting_badges |= (1 << 0) + if start_inventory.pop("Knuckle Badge", 0) > 0: + starting_badges |= (1 << 1) + if start_inventory.pop("Dynamo Badge", 0) > 0: + starting_badges |= (1 << 2) + if start_inventory.pop("Heat Badge", 0) > 0: + starting_badges |= (1 << 3) + if start_inventory.pop("Balance Badge", 0) > 0: + starting_badges |= (1 << 4) + if start_inventory.pop("Feather Badge", 0) > 0: + starting_badges |= (1 << 5) + if start_inventory.pop("Mind Badge", 0) > 0: + starting_badges |= (1 << 6) + if start_inventory.pop("Rain Badge", 0) > 0: + starting_badges |= (1 << 7) + + pc_slots: List[Tuple[str, int]] = [] + while any(qty > 0 for qty in start_inventory.values()): + if len(pc_slots) >= 19: + break + + for i, item_name in enumerate(start_inventory.keys()): + if len(pc_slots) >= 19: + break + + quantity = min(start_inventory[item_name], 999) + if quantity == 0: + continue + + start_inventory[item_name] -= quantity + + pc_slots.append((item_name, quantity)) + + pc_slots.sort(reverse=True) + + for i, slot in enumerate(pc_slots): + address = data.rom_addresses["sNewGamePCItems"] + (i * 4) + item = reverse_offset_item_value(world.item_name_to_id[slot[0]]) + _set_bytes_little_endian(patched_rom, address + 0, 2, item) + _set_bytes_little_endian(patched_rom, address + 2, 2, slot[1]) + + # Set species data + _set_species_info(world, patched_rom) + + # Set encounter tables + if world.options.wild_pokemon != RandomizeWildPokemon.option_vanilla: + _set_encounter_tables(world, patched_rom) + + # Set opponent data + if world.options.trainer_parties != RandomizeTrainerParties.option_vanilla: + _set_opponents(world, patched_rom) + + # Set static pokemon + _set_static_encounters(world, patched_rom) + + # Set starters + _set_starters(world, patched_rom) + + # Set TM moves + _set_tm_moves(world, patched_rom) + + # Set TM/HM compatibility + _set_tmhm_compatibility(world, patched_rom) + + # Randomize opponent double or single + _randomize_opponent_battle_type(world, patched_rom) + + # Options + # struct ArchipelagoOptions + # { + # /* 0x00 */ bool8 advanceTextWithHoldA; + # /* 0x01 */ bool8 isFerryEnabled; + # /* 0x02 */ bool8 areTrainersBlind; + # /* 0x03 */ bool8 canFlyWithoutBadge; + # /* 0x04 */ u16 expMultiplierNumerator; + # /* 0x06 */ u16 expMultiplierDenominator; + # /* 0x08 */ u16 birchPokemon; + # /* 0x0A */ bool8 guaranteedCatch; + # /* 0x0B */ bool8 betterShopsEnabled; + # /* 0x0C */ bool8 eliteFourRequiresGyms; + # /* 0x0D */ u8 eliteFourRequiredCount; + # /* 0x0E */ bool8 normanRequiresGyms; + # /* 0x0F */ u8 normanRequiredCount; + # /* 0x10 */ u8 startingBadges; + # /* 0x11 */ u8 receivedItemMessageFilter; // 0 = Show All; 1 = Show Progression Only; 2 = Show None + # /* 0x12 */ bool8 reusableTms; + # /* 0x14 */ u16 removedBlockers; + # /* 0x13 */ bool8 addRoute115Boulders; + # /* 0x14 */ u16 removedBlockers; + # /* 0x14 */ u16 removedBlockers; + # /* 0x16 */ u8 freeFlyLocation; + # }; + options_address = data.rom_addresses["gArchipelagoOptions"] + + # Set hold A to advance text + turbo_a = 1 if world.options.turbo_a else 0 + _set_bytes_little_endian(patched_rom, options_address + 0x00, 1, turbo_a) + + # Set ferry enabled + enable_ferry = 1 if world.options.enable_ferry else 0 + _set_bytes_little_endian(patched_rom, options_address + 0x01, 1, enable_ferry) + + # Set blind trainers + blind_trainers = 1 if world.options.blind_trainers else 0 + _set_bytes_little_endian(patched_rom, options_address + 0x02, 1, blind_trainers) + + # Set fly without badge + fly_without_badge = 1 if world.options.fly_without_badge else 0 + _set_bytes_little_endian(patched_rom, options_address + 0x03, 1, fly_without_badge) + + # Set exp modifier + numerator = min(max(world.options.exp_modifier.value, 0), 2**16 - 1) + _set_bytes_little_endian(patched_rom, options_address + 0x04, 2, numerator) + _set_bytes_little_endian(patched_rom, options_address + 0x06, 2, 100) + + # Set Birch pokemon + _set_bytes_little_endian( + patched_rom, + options_address + 0x08, + 2, + get_random_species(world.random, data.species).species_id + ) + + # Set guaranteed catch + guaranteed_catch = 1 if world.options.guaranteed_catch else 0 + _set_bytes_little_endian(patched_rom, options_address + 0x0A, 1, guaranteed_catch) + + # Set better shops + better_shops = 1 if world.options.better_shops else 0 + _set_bytes_little_endian(patched_rom, options_address + 0x0B, 1, better_shops) + + # Set elite four requirement + elite_four_requires_gyms = 1 if world.options.elite_four_requirement == EliteFourRequirement.option_gyms else 0 + _set_bytes_little_endian(patched_rom, options_address + 0x0C, 1, elite_four_requires_gyms) + + # Set elite four count + elite_four_count = min(max(world.options.elite_four_count.value, 0), 8) + _set_bytes_little_endian(patched_rom, options_address + 0x0D, 1, elite_four_count) + + # Set norman requirement + norman_requires_gyms = 1 if world.options.norman_requirement == NormanRequirement.option_gyms else 0 + _set_bytes_little_endian(patched_rom, options_address + 0x0E, 1, norman_requires_gyms) + + # Set norman count + norman_count = min(max(world.options.norman_count.value, 0), 8) + _set_bytes_little_endian(patched_rom, options_address + 0x0F, 1, norman_count) + + # Set starting badges + _set_bytes_little_endian(patched_rom, options_address + 0x10, 1, starting_badges) + + # Set receive item messages type + receive_item_messages_type = world.options.receive_item_messages.value + _set_bytes_little_endian(patched_rom, options_address + 0x11, 1, receive_item_messages_type) + + # Set reusable TMs + reusable_tms = 1 if world.options.reusable_tms else 0 + _set_bytes_little_endian(patched_rom, options_address + 0x12, 1, reusable_tms) + + # Set route 115 boulders + route_115_boulders = 1 if world.options.extra_boulders else 0 + _set_bytes_little_endian(patched_rom, options_address + 0x13, 1, route_115_boulders) + + # Set removed blockers + removed_roadblocks = world.options.remove_roadblocks.value + removed_roadblocks_bitfield = 0 + removed_roadblocks_bitfield |= (1 << 0) if "Safari Zone Construction Workers" in removed_roadblocks else 0 + removed_roadblocks_bitfield |= (1 << 1) if "Lilycove City Wailmer" in removed_roadblocks else 0 + removed_roadblocks_bitfield |= (1 << 2) if "Route 110 Aqua Grunts" in removed_roadblocks else 0 + removed_roadblocks_bitfield |= (1 << 3) if "Aqua Hideout Grunts" in removed_roadblocks else 0 + removed_roadblocks_bitfield |= (1 << 4) if "Route 119 Aqua Grunts" in removed_roadblocks else 0 + removed_roadblocks_bitfield |= (1 << 5) if "Route 112 Magma Grunts" in removed_roadblocks else 0 + removed_roadblocks_bitfield |= (1 << 6) if "Seafloor Cavern Aqua Grunt" in removed_roadblocks else 0 + _set_bytes_little_endian(patched_rom, options_address + 0x14, 2, removed_roadblocks_bitfield) + + # Set slot name + player_name = world.multiworld.get_player_name(world.player) + for i, byte in enumerate(player_name.encode("utf-8")): + _set_bytes_little_endian(patched_rom, data.rom_addresses["gArchipelagoInfo"] + i, 1, byte) + + # Write Output + out_file_name = world.multiworld.get_out_file_name_base(world.player) + output_path = os.path.join(output_directory, f"{out_file_name}.gba") + with open(output_path, "wb") as out_file: + out_file.write(patched_rom) + patch = PokemonEmeraldDeltaPatch(os.path.splitext(output_path)[0] + ".apemerald", player=world.player, + player_name=player_name, patched_path=output_path) + + patch.write() + os.unlink(output_path) + + +def get_base_rom_as_bytes() -> bytes: + with open(get_settings().pokemon_emerald_settings.rom_file, "rb") as infile: + base_rom_bytes = bytes(infile.read()) + + return base_rom_bytes + + +def _set_bytes_little_endian(byte_array: bytearray, address: int, size: int, value: int) -> None: + offset = 0 + while size > 0: + byte_array[address + offset] = value & 0xFF + value = value >> 8 + offset += 1 + size -= 1 + + +def _set_encounter_tables(world: "PokemonEmeraldWorld", rom: bytearray) -> None: + """ + Encounter tables are lists of + struct { + min_level: 0x01 bytes, + max_level: 0x01 bytes, + species_id: 0x02 bytes + } + """ + + for map_data in world.modified_maps: + 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.rom_address + 2 + (4 * i) + _set_bytes_little_endian(rom, address, 2, species_id) + + +def _set_species_info(world: "PokemonEmeraldWorld", rom: bytearray) -> None: + for species in world.modified_species: + if species is not None: + _set_bytes_little_endian(rom, species.rom_address + 6, 1, species.types[0]) + _set_bytes_little_endian(rom, species.rom_address + 7, 1, species.types[1]) + _set_bytes_little_endian(rom, species.rom_address + 8, 1, species.catch_rate) + _set_bytes_little_endian(rom, species.rom_address + 22, 1, species.abilities[0]) + _set_bytes_little_endian(rom, species.rom_address + 23, 1, species.abilities[1]) + + for i, learnset_move in enumerate(species.learnset): + level_move = learnset_move.level << 9 | learnset_move.move_id + _set_bytes_little_endian(rom, species.learnset_rom_address + (i * 2), 2, level_move) + + +def _set_opponents(world: "PokemonEmeraldWorld", rom: bytearray) -> None: + for trainer in world.modified_trainers: + party_address = trainer.party.rom_address + + pokemon_data_size: int + if trainer.party.pokemon_data_type in {TrainerPokemonDataTypeEnum.NO_ITEM_DEFAULT_MOVES, TrainerPokemonDataTypeEnum.ITEM_DEFAULT_MOVES}: + pokemon_data_size = 8 + else: # Custom Moves + pokemon_data_size = 16 + + for i, pokemon in enumerate(trainer.party.pokemon): + pokemon_address = party_address + (i * pokemon_data_size) + + # Replace species + _set_bytes_little_endian(rom, pokemon_address + 0x04, 2, pokemon.species_id) + + # Replace custom moves if applicable + if trainer.party.pokemon_data_type == TrainerPokemonDataTypeEnum.NO_ITEM_CUSTOM_MOVES: + _set_bytes_little_endian(rom, pokemon_address + 0x06, 2, pokemon.moves[0]) + _set_bytes_little_endian(rom, pokemon_address + 0x08, 2, pokemon.moves[1]) + _set_bytes_little_endian(rom, pokemon_address + 0x0A, 2, pokemon.moves[2]) + _set_bytes_little_endian(rom, pokemon_address + 0x0C, 2, pokemon.moves[3]) + elif trainer.party.pokemon_data_type == TrainerPokemonDataTypeEnum.ITEM_CUSTOM_MOVES: + _set_bytes_little_endian(rom, pokemon_address + 0x08, 2, pokemon.moves[0]) + _set_bytes_little_endian(rom, pokemon_address + 0x0A, 2, pokemon.moves[1]) + _set_bytes_little_endian(rom, pokemon_address + 0x0C, 2, pokemon.moves[2]) + _set_bytes_little_endian(rom, pokemon_address + 0x0E, 2, pokemon.moves[3]) + + +def _set_static_encounters(world: "PokemonEmeraldWorld", rom: bytearray) -> None: + for encounter in world.modified_static_encounters: + _set_bytes_little_endian(rom, encounter.rom_address, 2, encounter.species_id) + + +def _set_starters(world: "PokemonEmeraldWorld", rom: bytearray) -> None: + address = data.rom_addresses["sStarterMon"] + (starter_1, starter_2, starter_3) = world.modified_starters + + _set_bytes_little_endian(rom, address + 0, 2, starter_1) + _set_bytes_little_endian(rom, address + 2, 2, starter_2) + _set_bytes_little_endian(rom, address + 4, 2, starter_3) + + +def _set_tm_moves(world: "PokemonEmeraldWorld", rom: bytearray) -> None: + tmhm_list_address = data.rom_addresses["sTMHMMoves"] + + for i, move in enumerate(world.modified_tmhm_moves): + # Don't modify HMs + if i >= 50: + break + + _set_bytes_little_endian(rom, tmhm_list_address + (i * 2), 2, move) + + +def _set_tmhm_compatibility(world: "PokemonEmeraldWorld", rom: bytearray) -> None: + learnsets_address = data.rom_addresses["gTMHMLearnsets"] + + for species in world.modified_species: + if species is not None: + _set_bytes_little_endian(rom, learnsets_address + (species.species_id * 8), 8, species.tm_hm_compatibility) + + +def _randomize_opponent_battle_type(world: "PokemonEmeraldWorld", rom: bytearray) -> None: + probability = world.options.double_battle_chance.value / 100 + + battle_type_map = { + 0: 4, + 1: 8, + 2: 6, + 3: 13, + } + + for trainer_data in data.trainers: + if trainer_data.battle_script_rom_address != 0 and len(trainer_data.party.pokemon) > 1: + if world.random.random() < probability: + # Set the trainer to be a double battle + _set_bytes_little_endian(rom, trainer_data.rom_address + 0x18, 1, 1) + + # Swap the battle type in the script for the purpose of loading the right text + # and setting data to the right places + original_battle_type = rom[trainer_data.battle_script_rom_address + 1] + if original_battle_type in battle_type_map: + _set_bytes_little_endian( + rom, + trainer_data.battle_script_rom_address + 1, + 1, + battle_type_map[original_battle_type] + ) diff --git a/worlds/pokemon_emerald/rules.py b/worlds/pokemon_emerald/rules.py new file mode 100644 index 000000000000..97110746fb5d --- /dev/null +++ b/worlds/pokemon_emerald/rules.py @@ -0,0 +1,1372 @@ +""" +Logic rule definitions for Pokemon Emerald +""" +from typing import TYPE_CHECKING + +from BaseClasses import CollectionState +from worlds.generic.Rules import add_rule, set_rule + +from .data import data +from .options import EliteFourRequirement, NormanRequirement, Goal + +if TYPE_CHECKING: + from . import PokemonEmeraldWorld + + +# Rules are organized by town/route/dungeon and ordered approximately +# by when you would first reach that place in a vanilla playthrough. +def set_rules(world: "PokemonEmeraldWorld") -> None: + def can_cut(state: CollectionState): + return state.has("HM01 Cut", world.player) and state.has("Stone Badge", world.player) + + def can_surf(state: CollectionState): + return state.has("HM03 Surf", world.player) and state.has("Balance Badge", world.player) + + def can_strength(state: CollectionState): + return state.has("HM04 Strength", world.player) and state.has("Heat Badge", world.player) + + def can_flash(state: CollectionState): + return state.has("HM05 Flash", world.player) and state.has("Knuckle Badge", world.player) + + def can_rock_smash(state: CollectionState): + return state.has("HM06 Rock Smash", world.player) and state.has("Dynamo Badge", world.player) + + def can_waterfall(state: CollectionState): + return state.has("HM07 Waterfall", world.player) and state.has("Rain Badge", world.player) + + def can_dive(state: CollectionState): + return state.has("HM08 Dive", world.player) and state.has("Mind Badge", world.player) + + def has_acro_bike(state: CollectionState): + return state.has("Acro Bike", world.player) + + def has_mach_bike(state: CollectionState): + return state.has("Mach Bike", world.player) + + def defeated_n_gym_leaders(state: CollectionState, n: int) -> bool: + return sum([state.has(event, world.player) for event in [ + "EVENT_DEFEAT_ROXANNE", + "EVENT_DEFEAT_BRAWLY", + "EVENT_DEFEAT_WATTSON", + "EVENT_DEFEAT_FLANNERY", + "EVENT_DEFEAT_NORMAN", + "EVENT_DEFEAT_WINONA", + "EVENT_DEFEAT_TATE_AND_LIZA", + "EVENT_DEFEAT_JUAN" + ]]) >= n + + def get_entrance(entrance: str): + return world.multiworld.get_entrance(entrance, world.player) + + def get_location(location: str): + if location in data.locations: + location = data.locations[location].label + + return world.multiworld.get_location(location, world.player) + + victory_event_name = "EVENT_DEFEAT_CHAMPION" + if world.options.goal == Goal.option_steven: + victory_event_name = "EVENT_DEFEAT_STEVEN" + elif world.options.goal == Goal.option_norman: + victory_event_name = "EVENT_DEFEAT_NORMAN" + + world.multiworld.completion_condition[world.player] = lambda state: state.has(victory_event_name, world.player) + + # Sky + if world.options.fly_without_badge: + set_rule( + get_entrance("REGION_LITTLEROOT_TOWN/MAIN -> REGION_SKY"), + lambda state: state.has("HM02 Fly", world.player) + ) + else: + set_rule( + get_entrance("REGION_LITTLEROOT_TOWN/MAIN -> REGION_SKY"), + lambda state: state.has("HM02 Fly", world.player) and state.has("Feather Badge", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_LITTLEROOT_TOWN/MAIN"), + lambda state: state.has("EVENT_VISITED_LITTLEROOT_TOWN", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_OLDALE_TOWN/MAIN"), + lambda state: state.has("EVENT_VISITED_OLDALE_TOWN", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_PETALBURG_CITY/MAIN"), + lambda state: state.has("EVENT_VISITED_PETALBURG_CITY", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_RUSTBORO_CITY/MAIN"), + lambda state: state.has("EVENT_VISITED_RUSTBORO_CITY", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_DEWFORD_TOWN/MAIN"), + lambda state: state.has("EVENT_VISITED_DEWFORD_TOWN", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_SLATEPORT_CITY/MAIN"), + lambda state: state.has("EVENT_VISITED_SLATEPORT_CITY", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_MAUVILLE_CITY/MAIN"), + lambda state: state.has("EVENT_VISITED_MAUVILLE_CITY", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_VERDANTURF_TOWN/MAIN"), + lambda state: state.has("EVENT_VISITED_VERDANTURF_TOWN", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_FALLARBOR_TOWN/MAIN"), + lambda state: state.has("EVENT_VISITED_FALLARBOR_TOWN", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_LAVARIDGE_TOWN/MAIN"), + lambda state: state.has("EVENT_VISITED_LAVARIDGE_TOWN", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_FORTREE_CITY/MAIN"), + lambda state: state.has("EVENT_VISITED_FORTREE_CITY", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_LILYCOVE_CITY/MAIN"), + lambda state: state.has("EVENT_VISITED_LILYCOVE_CITY", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_MOSSDEEP_CITY/MAIN"), + lambda state: state.has("EVENT_VISITED_MOSSDEEP_CITY", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_SOOTOPOLIS_CITY/EAST"), + lambda state: state.has("EVENT_VISITED_SOOTOPOLIS_CITY", world.player) + ) + set_rule( + get_entrance("REGION_SKY -> REGION_EVER_GRANDE_CITY/SOUTH"), + lambda state: state.has("EVENT_VISITED_EVER_GRANDE_CITY", world.player) + ) + + # Route 103 + set_rule( + get_entrance("REGION_ROUTE103/EAST -> REGION_ROUTE103/WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE103/WEST -> REGION_ROUTE103/WATER"), + can_surf + ) + + # Petalburg City + set_rule( + get_entrance("REGION_PETALBURG_CITY/MAIN -> REGION_PETALBURG_CITY/SOUTH_POND"), + can_surf + ) + set_rule( + get_entrance("REGION_PETALBURG_CITY/MAIN -> REGION_PETALBURG_CITY/NORTH_POND"), + can_surf + ) + set_rule( + get_location("NPC_GIFT_RECEIVED_HM03"), + lambda state: state.has("EVENT_DEFEAT_NORMAN", world.player) + ) + if world.options.norman_requirement == NormanRequirement.option_badges: + set_rule( + get_entrance("MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3"), + lambda state: state.has_group("Badges", world.player, world.options.norman_count.value) + ) + set_rule( + get_entrance("MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6"), + lambda state: state.has_group("Badges", world.player, world.options.norman_count.value) + ) + else: + set_rule( + get_entrance("MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3"), + lambda state: defeated_n_gym_leaders(state, world.options.norman_count.value) + ) + set_rule( + get_entrance("MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6"), + lambda state: defeated_n_gym_leaders(state, world.options.norman_count.value) + ) + + # Route 104 + set_rule( + get_entrance("REGION_ROUTE104/SOUTH -> REGION_ROUTE105/MAIN"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN"), + lambda state: state.has("EVENT_TALK_TO_MR_STONE", world.player) + ) + + # Petalburg Woods + set_rule( + get_entrance("REGION_PETALBURG_WOODS/WEST_PATH -> REGION_PETALBURG_WOODS/EAST_PATH"), + can_cut + ) + + # Rustboro City + set_rule( + get_location("EVENT_RETURN_DEVON_GOODS"), + lambda state: state.has("EVENT_RECOVER_DEVON_GOODS", world.player) + ) + + # Devon Corp + set_rule( + get_entrance("MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0"), + lambda state: state.has("EVENT_RETURN_DEVON_GOODS", world.player) + ) + + # Route 116 + set_rule( + get_entrance("REGION_ROUTE116/WEST -> REGION_ROUTE116/WEST_ABOVE_LEDGE"), + can_cut + ) + + # Rusturf Tunnel + set_rule( + get_entrance("REGION_RUSTURF_TUNNEL/WEST -> REGION_RUSTURF_TUNNEL/EAST"), + can_rock_smash + ) + set_rule( + get_entrance("REGION_RUSTURF_TUNNEL/EAST -> REGION_RUSTURF_TUNNEL/WEST"), + can_rock_smash + ) + set_rule( + get_location("NPC_GIFT_RECEIVED_HM04"), + can_rock_smash + ) + set_rule( + get_location("EVENT_RECOVER_DEVON_GOODS"), + lambda state: state.has("EVENT_DEFEAT_ROXANNE", world.player) + ) + + # Route 115 + set_rule( + get_entrance("REGION_ROUTE115/SOUTH_BELOW_LEDGE -> REGION_ROUTE115/SEA"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE -> REGION_ROUTE115/SEA"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE115/SOUTH_ABOVE_LEDGE -> REGION_ROUTE115/SOUTH_BEHIND_ROCK"), + can_rock_smash + ) + set_rule( + get_entrance("REGION_ROUTE115/NORTH_BELOW_SLOPE -> REGION_ROUTE115/SEA"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE115/NORTH_BELOW_SLOPE -> REGION_ROUTE115/NORTH_ABOVE_SLOPE"), + lambda state: has_mach_bike(state) + ) + if world.options.extra_boulders: + set_rule( + get_entrance("REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE -> REGION_ROUTE115/SOUTH_ABOVE_LEDGE"), + can_strength + ) + set_rule( + get_entrance("REGION_ROUTE115/SOUTH_ABOVE_LEDGE -> REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE"), + can_strength + ) + + # Route 105 + set_rule( + get_entrance("REGION_ROUTE105/MAIN -> REGION_UNDERWATER_ROUTE105/MAIN"), + can_dive + ) + + # Route 106 + set_rule( + get_entrance("REGION_ROUTE106/EAST -> REGION_ROUTE106/SEA"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE106/WEST -> REGION_ROUTE106/SEA"), + can_surf + ) + + # Dewford Town + set_rule( + get_entrance("REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE109/BEACH"), + lambda state: + state.can_reach("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN", "Entrance", world.player) + and state.has("EVENT_TALK_TO_MR_STONE", world.player) + and state.has("EVENT_DELIVER_LETTER", world.player) + ) + set_rule( + get_entrance("REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN"), + lambda state: + state.can_reach("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN", "Entrance", world.player) + and state.has("EVENT_TALK_TO_MR_STONE", world.player) + ) + + # Granite Cave + set_rule( + get_entrance("REGION_GRANITE_CAVE_STEVENS_ROOM/MAIN -> REGION_GRANITE_CAVE_STEVENS_ROOM/LETTER_DELIVERED"), + lambda state: state.has("Letter", world.player) + ) + set_rule( + get_entrance("REGION_GRANITE_CAVE_B1F/LOWER -> REGION_GRANITE_CAVE_B1F/UPPER"), + lambda state: has_mach_bike(state) + ) + + # Route 107 + set_rule( + get_entrance("REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE107/MAIN"), + can_surf + ) + + # Route 109 + set_rule( + get_entrance("REGION_ROUTE109/BEACH -> REGION_DEWFORD_TOWN/MAIN"), + lambda state: + state.can_reach("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN", "Entrance", world.player) + and state.can_reach("REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE109/BEACH", "Entrance", world.player) + and state.has("EVENT_TALK_TO_MR_STONE", world.player) + and state.has("EVENT_DELIVER_LETTER", world.player) + ) + set_rule( + get_entrance("REGION_ROUTE109/BEACH -> REGION_ROUTE109/SEA"), + can_surf + ) + + # Slateport City + set_rule( + get_entrance("REGION_SLATEPORT_CITY/MAIN -> REGION_ROUTE134/WEST"), + can_surf + ) + set_rule( + get_location("EVENT_TALK_TO_DOCK"), + lambda state: state.has("Devon Goods", world.player) + ) + set_rule( + get_entrance("MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1"), + lambda state: state.has("EVENT_TALK_TO_DOCK", world.player) + ) + set_rule( + get_location("EVENT_AQUA_STEALS_SUBMARINE"), + lambda state: state.has("EVENT_RELEASE_GROUDON", world.player) + ) + set_rule( + get_entrance("REGION_SLATEPORT_CITY_HARBOR/MAIN -> REGION_SS_TIDAL_CORRIDOR/MAIN"), + lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) + ) + + # Route 110 + set_rule( + get_entrance("REGION_ROUTE110/MAIN -> REGION_ROUTE110/SOUTH_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE110/MAIN -> REGION_ROUTE110/NORTH_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE/WEST -> REGION_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE/EAST"), + lambda state: has_acro_bike(state) or has_mach_bike(state) + ) + set_rule( + get_entrance("REGION_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE/WEST -> REGION_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE/EAST"), + lambda state: has_acro_bike(state) or has_mach_bike(state) + ) + if "Route 110 Aqua Grunts" not in world.options.remove_roadblocks.value: + set_rule( + get_entrance("REGION_ROUTE110/SOUTH -> REGION_ROUTE110/MAIN"), + lambda state: state.has("EVENT_RESCUE_CAPT_STERN", world.player) + ) + set_rule( + get_entrance("REGION_ROUTE110/MAIN -> REGION_ROUTE110/SOUTH"), + lambda state: state.has("EVENT_RESCUE_CAPT_STERN", world.player) + ) + + # Mauville City + set_rule( + get_location("NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON"), + lambda state: state.has("EVENT_DEFEAT_NORMAN", world.player) + ) + + # Route 111 + set_rule( + get_entrance("REGION_ROUTE111/MIDDLE -> REGION_ROUTE111/DESERT"), + lambda state: state.has("Go Goggles", world.player) + ) + set_rule( + get_entrance("REGION_ROUTE111/NORTH -> REGION_ROUTE111/DESERT"), + lambda state: state.has("Go Goggles", world.player) + ) + set_rule( + get_entrance("REGION_ROUTE111/MIDDLE -> REGION_ROUTE111/SOUTH"), + can_rock_smash + ) + set_rule( + get_entrance("REGION_ROUTE111/SOUTH -> REGION_ROUTE111/SOUTH_POND"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE111/SOUTH -> REGION_ROUTE111/MIDDLE"), + can_rock_smash + ) + set_rule( + get_entrance("MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0"), + lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) + ) + + # Route 112 + if "Route 112 Magma Grunts" not in world.options.remove_roadblocks.value: + set_rule( + get_entrance("REGION_ROUTE112/SOUTH_EAST -> REGION_ROUTE112/CABLE_CAR_STATION_ENTRANCE"), + lambda state: state.has("EVENT_MAGMA_STEALS_METEORITE", world.player) + ) + set_rule( + get_entrance("REGION_ROUTE112/CABLE_CAR_STATION_ENTRANCE -> REGION_ROUTE112/SOUTH_EAST"), + lambda state: state.has("EVENT_MAGMA_STEALS_METEORITE", world.player) + ) + + # Fiery Path + set_rule( + get_entrance("REGION_FIERY_PATH/MAIN -> REGION_FIERY_PATH/BEHIND_BOULDER"), + can_strength + ) + + # Route 114 + set_rule( + get_entrance("REGION_ROUTE114/MAIN -> REGION_ROUTE114/ABOVE_WATERFALL"), + lambda state: can_surf(state) and can_waterfall(state) + ) + set_rule( + get_entrance("REGION_ROUTE114/ABOVE_WATERFALL -> REGION_ROUTE114/MAIN"), + lambda state: can_surf(state) and can_waterfall(state) + ) + set_rule( + get_entrance("MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0"), + lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) + ) + + # Meteor Falls + set_rule( + get_entrance("REGION_METEOR_FALLS_1F_1R/MAIN -> REGION_METEOR_FALLS_1F_1R/ABOVE_WATERFALL"), + lambda state: can_surf(state) and can_waterfall(state) + ) + set_rule( + get_entrance("REGION_METEOR_FALLS_1F_1R/ABOVE_WATERFALL -> REGION_METEOR_FALLS_1F_1R/MAIN"), + can_surf + ) + set_rule( + get_entrance("MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0"), + lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) + ) + set_rule( + get_entrance("REGION_METEOR_FALLS_B1F_1R/HIGHEST_LADDER -> REGION_METEOR_FALLS_B1F_1R/WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_METEOR_FALLS_B1F_1R/NORTH_SHORE -> REGION_METEOR_FALLS_B1F_1R/WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_METEOR_FALLS_B1F_1R/SOUTH_SHORE -> REGION_METEOR_FALLS_B1F_1R/WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_METEOR_FALLS_B1F_2R/ENTRANCE -> REGION_METEOR_FALLS_B1F_2R/WATER"), + can_surf + ) + + # Jagged Pass + set_rule( + get_entrance("REGION_JAGGED_PASS/BOTTOM -> REGION_JAGGED_PASS/MIDDLE"), + lambda state: has_acro_bike(state) + ) + set_rule( + get_entrance("REGION_JAGGED_PASS/MIDDLE -> REGION_JAGGED_PASS/TOP"), + lambda state: has_acro_bike(state) + ) + set_rule( + get_entrance("MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0"), + lambda state: state.has("Magma Emblem", world.player) + ) + + # Lavaridge Town + set_rule( + get_location("NPC_GIFT_RECEIVED_GO_GOGGLES"), + lambda state: state.has("EVENT_DEFEAT_FLANNERY", world.player) + ) + + # Mirage Tower + set_rule( + get_entrance("REGION_MIRAGE_TOWER_2F/TOP -> REGION_MIRAGE_TOWER_2F/BOTTOM"), + lambda state: has_mach_bike(state) + ) + set_rule( + get_entrance("REGION_MIRAGE_TOWER_2F/BOTTOM -> REGION_MIRAGE_TOWER_2F/TOP"), + lambda state: has_mach_bike(state) + ) + set_rule( + get_entrance("REGION_MIRAGE_TOWER_3F/TOP -> REGION_MIRAGE_TOWER_3F/BOTTOM"), + can_rock_smash + ) + set_rule( + get_entrance("REGION_MIRAGE_TOWER_3F/BOTTOM -> REGION_MIRAGE_TOWER_3F/TOP"), + can_rock_smash + ) + set_rule( + get_entrance("REGION_MIRAGE_TOWER_4F/MAIN -> REGION_MIRAGE_TOWER_4F/FOSSIL_PLATFORM"), + can_rock_smash + ) + + # Abandoned Ship + set_rule( + get_entrance("REGION_ABANDONED_SHIP_ROOMS_B1F/CENTER -> REGION_ABANDONED_SHIP_UNDERWATER1/MAIN"), + can_dive + ) + set_rule( + get_entrance("REGION_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS/MAIN -> REGION_ABANDONED_SHIP_UNDERWATER2/MAIN"), + can_dive + ) + set_rule( + get_entrance("MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0"), + lambda state: state.has("Room 1 Key", world.player) + ) + set_rule( + get_entrance("MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2"), + lambda state: state.has("Room 2 Key", world.player) + ) + set_rule( + get_entrance("MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6"), + lambda state: state.has("Room 4 Key", world.player) + ) + set_rule( + get_entrance("MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8"), + lambda state: state.has("Room 6 Key", world.player) + ) + set_rule( + get_entrance("MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0"), + lambda state: state.has("Storage Key", world.player) + ) + + # New Mauville + set_rule( + get_entrance("MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0"), + lambda state: state.has("Basement Key", world.player) + ) + + # Route 118 + set_rule( + get_entrance("REGION_ROUTE118/WEST -> REGION_ROUTE118/WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE118/EAST -> REGION_ROUTE118/WATER"), + can_surf + ) + + # Route 119 + set_rule( + get_entrance("REGION_ROUTE119/LOWER -> REGION_ROUTE119/LOWER_ACROSS_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE119/LOWER_ACROSS_WATER -> REGION_ROUTE119/LOWER"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE119/LOWER -> REGION_ROUTE119/LOWER_ACROSS_RAILS"), + lambda state: has_acro_bike(state) + ) + set_rule( + get_entrance("REGION_ROUTE119/LOWER_ACROSS_RAILS -> REGION_ROUTE119/LOWER"), + lambda state: has_acro_bike(state) + ) + set_rule( + get_entrance("REGION_ROUTE119/UPPER -> REGION_ROUTE119/MIDDLE_RIVER"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE119/MIDDLE_RIVER -> REGION_ROUTE119/ABOVE_WATERFALL"), + can_waterfall + ) + set_rule( + get_entrance("REGION_ROUTE119/ABOVE_WATERFALL -> REGION_ROUTE119/MIDDLE_RIVER"), + can_waterfall + ) + set_rule( + get_entrance("REGION_ROUTE119/ABOVE_WATERFALL -> REGION_ROUTE119/ABOVE_WATERFALL_ACROSS_RAILS"), + lambda state: has_acro_bike(state) + ) + if "Route 119 Aqua Grunts" not in world.options.remove_roadblocks.value: + set_rule( + get_entrance("REGION_ROUTE119/MIDDLE -> REGION_ROUTE119/UPPER"), + lambda state: state.has("EVENT_DEFEAT_SHELLY", world.player) + ) + set_rule( + get_entrance("REGION_ROUTE119/UPPER -> REGION_ROUTE119/MIDDLE"), + lambda state: state.has("EVENT_DEFEAT_SHELLY", world.player) + ) + + # Fortree City + set_rule( + get_entrance("REGION_FORTREE_CITY/MAIN -> REGION_FORTREE_CITY/BEFORE_GYM"), + lambda state: state.has("Devon Scope", world.player) + ) + set_rule( + get_entrance("REGION_FORTREE_CITY/BEFORE_GYM -> REGION_FORTREE_CITY/MAIN"), + lambda state: state.has("Devon Scope", world.player) + ) + + # Route 120 + set_rule( + get_entrance("REGION_ROUTE120/NORTH -> REGION_ROUTE120/NORTH_POND_SHORE"), + lambda state: state.has("Devon Scope", world.player) + ) + set_rule( + get_entrance("REGION_ROUTE120/NORTH_POND_SHORE -> REGION_ROUTE120/NORTH"), + lambda state: state.has("Devon Scope", world.player) + ) + set_rule( + get_entrance("REGION_ROUTE120/NORTH_POND_SHORE -> REGION_ROUTE120/NORTH_POND"), + can_surf + ) + + # Route 121 + set_rule( + get_entrance("REGION_ROUTE121/EAST -> REGION_ROUTE121/WEST"), + can_cut + ) + set_rule( + get_entrance("REGION_ROUTE121/EAST -> REGION_ROUTE122/SEA"), + can_surf + ) + + # Safari Zone + set_rule( + get_entrance("MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0"), + lambda state: state.has("Pokeblock Case", world.player) + ) + set_rule( + get_entrance("REGION_SAFARI_ZONE_SOUTH/MAIN -> REGION_SAFARI_ZONE_NORTH/MAIN"), + lambda state: has_acro_bike(state) + ) + set_rule( + get_entrance("REGION_SAFARI_ZONE_SOUTHWEST/MAIN -> REGION_SAFARI_ZONE_NORTHWEST/MAIN"), + lambda state: has_mach_bike(state) + ) + if "Safari Zone Construction Workers" not in world.options.remove_roadblocks.value: + set_rule( + get_entrance("REGION_SAFARI_ZONE_SOUTH/MAIN -> REGION_SAFARI_ZONE_SOUTHEAST/MAIN"), + lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) + ) + + # Route 122 + set_rule( + get_entrance("REGION_ROUTE122/MT_PYRE_ENTRANCE -> REGION_ROUTE122/SEA"), + can_surf + ) + + # Route 123 + set_rule( + get_entrance("REGION_ROUTE123/EAST -> REGION_ROUTE122/SEA"), + can_surf + ) + set_rule( + get_entrance("REGION_ROUTE123/EAST -> REGION_ROUTE123/EAST_BEHIND_TREE"), + can_cut + ) + + # Lilycove City + set_rule( + get_entrance("REGION_LILYCOVE_CITY/MAIN -> REGION_LILYCOVE_CITY/SEA"), + can_surf + ) + set_rule( + get_entrance("REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_SS_TIDAL_CORRIDOR/MAIN"), + lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) + ) + if "Lilycove City Wailmer" not in world.options.remove_roadblocks.value: + set_rule( + get_entrance("REGION_LILYCOVE_CITY/SEA -> REGION_ROUTE124/MAIN"), + lambda state: state.has("EVENT_CLEAR_AQUA_HIDEOUT", world.player) + ) + + # Magma Hideout + set_rule( + get_entrance("REGION_MAGMA_HIDEOUT_1F/ENTRANCE -> REGION_MAGMA_HIDEOUT_1F/MAIN"), + can_strength + ) + set_rule( + get_entrance("REGION_MAGMA_HIDEOUT_1F/MAIN -> REGION_MAGMA_HIDEOUT_1F/ENTRANCE"), + can_strength + ) + + # Aqua Hideout + if "Aqua Hideout Grunts" not in world.options.remove_roadblocks.value: + set_rule( + get_entrance("REGION_AQUA_HIDEOUT_1F/WATER -> REGION_AQUA_HIDEOUT_1F/MAIN"), + lambda state: state.has("EVENT_AQUA_STEALS_SUBMARINE", world.player) + ) + set_rule( + get_entrance("REGION_AQUA_HIDEOUT_1F/MAIN -> REGION_AQUA_HIDEOUT_1F/WATER"), + lambda state: can_surf(state) and state.has("EVENT_AQUA_STEALS_SUBMARINE", world.player) + ) + + # Route 124 + set_rule( + get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/BIG_AREA"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/SMALL_AREA_1"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/SMALL_AREA_2"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/SMALL_AREA_3"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_1"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_2"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_3"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_4"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/NORTH_ENCLOSED_AREA_1 -> REGION_UNDERWATER_ROUTE124/TUNNEL_1"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/NORTH_ENCLOSED_AREA_2 -> REGION_UNDERWATER_ROUTE124/TUNNEL_1"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/NORTH_ENCLOSED_AREA_3 -> REGION_UNDERWATER_ROUTE124/TUNNEL_2"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/SOUTH_ENCLOSED_AREA_1 -> REGION_UNDERWATER_ROUTE124/TUNNEL_3"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/SOUTH_ENCLOSED_AREA_2 -> REGION_UNDERWATER_ROUTE124/TUNNEL_3"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE124/SOUTH_ENCLOSED_AREA_3 -> REGION_UNDERWATER_ROUTE124/TUNNEL_4"), + can_dive + ) + + # Mossdeep City + set_rule( + get_entrance("REGION_MOSSDEEP_CITY/MAIN -> REGION_ROUTE124/MAIN"), + can_surf + ) + set_rule( + get_entrance("REGION_MOSSDEEP_CITY/MAIN -> REGION_ROUTE125/SEA"), + can_surf + ) + set_rule( + get_entrance("REGION_MOSSDEEP_CITY/MAIN -> REGION_ROUTE127/MAIN"), + can_surf + ) + set_rule( + get_location("EVENT_DEFEAT_MAXIE_AT_SPACE_STATION"), + lambda state: state.has("EVENT_DEFEAT_TATE_AND_LIZA", world.player) + ) + set_rule( + get_location("EVENT_STEVEN_GIVES_DIVE"), + lambda state: state.has("EVENT_DEFEAT_MAXIE_AT_SPACE_STATION", world.player) + ) + set_rule( + get_location("NPC_GIFT_RECEIVED_HM08"), + lambda state: state.has("EVENT_DEFEAT_MAXIE_AT_SPACE_STATION", world.player) + ) + + # Shoal Cave + set_rule( + get_entrance("REGION_SHOAL_CAVE_ENTRANCE_ROOM/SOUTH -> REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SHOAL_CAVE_ENTRANCE_ROOM/NORTH_WEST_CORNER -> REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SHOAL_CAVE_ENTRANCE_ROOM/NORTH_EAST_CORNER -> REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND -> REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_EAST_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND -> REGION_SHOAL_CAVE_INNER_ROOM/EAST_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND -> REGION_SHOAL_CAVE_INNER_ROOM/NORTH_WEST_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_WEST_CORNER -> REGION_SHOAL_CAVE_INNER_ROOM/NORTH_WEST_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SHOAL_CAVE_INNER_ROOM/RARE_CANDY_PLATFORM -> REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_EAST_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/NORTH_WEST -> REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/EAST"), + can_strength + ) + set_rule( + get_entrance("REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/EAST -> REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/NORTH_WEST"), + can_strength + ) + + # Route 126 + set_rule( + get_entrance("REGION_ROUTE126/MAIN -> REGION_UNDERWATER_ROUTE126/MAIN"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE126/MAIN -> REGION_UNDERWATER_ROUTE126/SMALL_AREA_2"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE126/NEAR_ROUTE_124 -> REGION_UNDERWATER_ROUTE126/TUNNEL"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE126/NORTH_WEST_CORNER -> REGION_UNDERWATER_ROUTE126/TUNNEL"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE126/WEST -> REGION_UNDERWATER_ROUTE126/MAIN"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE126/WEST -> REGION_UNDERWATER_ROUTE126/SMALL_AREA_1"), + can_dive + ) + + # Sootopolis City + set_rule( + get_entrance("REGION_SOOTOPOLIS_CITY/WATER -> REGION_UNDERWATER_SOOTOPOLIS_CITY/MAIN"), + can_dive + ) + set_rule( + get_entrance("REGION_SOOTOPOLIS_CITY/EAST -> REGION_SOOTOPOLIS_CITY/WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SOOTOPOLIS_CITY/WEST -> REGION_SOOTOPOLIS_CITY/WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SOOTOPOLIS_CITY/ISLAND -> REGION_SOOTOPOLIS_CITY/WATER"), + can_surf + ) + set_rule( + get_entrance("MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0"), + lambda state: state.has("EVENT_RELEASE_KYOGRE", world.player) + ) + set_rule( + get_entrance("MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0"), + lambda state: state.has("EVENT_WAKE_RAYQUAZA", world.player) + ) + set_rule( + get_location("NPC_GIFT_RECEIVED_HM07"), + lambda state: state.has("EVENT_WAKE_RAYQUAZA", world.player) + ) + + # Route 127 + set_rule( + get_entrance("REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/MAIN"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/TUNNEL"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/AREA_1"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/AREA_2"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/AREA_3"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE127/ENCLOSED_AREA -> REGION_UNDERWATER_ROUTE127/TUNNEL"), + can_dive + ) + + # Route 128 + set_rule( + get_entrance("REGION_ROUTE128/MAIN -> REGION_UNDERWATER_ROUTE128/MAIN"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE128/MAIN -> REGION_UNDERWATER_ROUTE128/AREA_1"), + can_dive + ) + set_rule( + get_entrance("REGION_ROUTE128/MAIN -> REGION_UNDERWATER_ROUTE128/AREA_2"), + can_dive + ) + + # Seafloor Cavern + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM1/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM1/NORTH"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM1/NORTH -> REGION_SEAFLOOR_CAVERN_ROOM1/SOUTH"), + can_strength + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST"), + can_strength + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST"), + can_strength + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST"), + can_rock_smash + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST"), + can_rock_smash + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_EAST"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM5/EAST"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM5/EAST -> REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST"), + can_strength + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM5/SOUTH_WEST"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM5/SOUTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM6/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM6/CAVE_ON_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM6/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM6/NORTH_WEST"), + can_surf + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM6/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM6/CAVE_ON_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM7/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM7/NORTH"), + can_surf + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM7/NORTH -> REGION_SEAFLOOR_CAVERN_ROOM7/SOUTH"), + can_surf + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM8/NORTH -> REGION_SEAFLOOR_CAVERN_ROOM8/SOUTH"), + can_strength + ) + set_rule( + get_entrance("REGION_SEAFLOOR_CAVERN_ROOM8/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM8/NORTH"), + can_strength + ) + if "Seafloor Cavern Aqua Grunt" not in world.options.remove_roadblocks.value: + set_rule( + get_entrance("MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0"), + lambda state: state.has("EVENT_STEVEN_GIVES_DIVE", world.player) + ) + + # Pacifidlog Town + set_rule( + get_entrance("REGION_PACIFIDLOG_TOWN/MAIN -> REGION_ROUTE131/MAIN"), + can_surf + ) + set_rule( + get_entrance("REGION_PACIFIDLOG_TOWN/MAIN -> REGION_ROUTE132/EAST"), + can_surf + ) + + # Sky Pillar + set_rule( + get_entrance("MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0"), + lambda state: state.has("EVENT_WALLACE_GOES_TO_SKY_PILLAR", world.player) + ) + # Sky Pillar does not require the mach bike until Rayquaza returns, which means the top + # is only logically locked behind the mach bike after the top has been reached already + # set_rule( + # get_entrance("REGION_SKY_PILLAR_2F/RIGHT -> REGION_SKY_PILLAR_2F/LEFT"), + # lambda state: has_mach_bike(state) + # ) + # set_rule( + # get_entrance("REGION_SKY_PILLAR_2F/LEFT -> REGION_SKY_PILLAR_2F/RIGHT"), + # lambda state: has_mach_bike(state) + # ) + # set_rule( + # get_entrance("REGION_SKY_PILLAR_4F/MAIN -> REGION_SKY_PILLAR_4F/ABOVE_3F_TOP_CENTER"), + # lambda state: has_mach_bike(state) + # ) + + # Route 134 + set_rule( + get_entrance("REGION_ROUTE134/MAIN -> REGION_UNDERWATER_ROUTE134/MAIN"), + can_dive + ) + + # Ever Grande City + set_rule( + get_entrance("REGION_EVER_GRANDE_CITY/SEA -> REGION_EVER_GRANDE_CITY/SOUTH"), + can_waterfall + ) + set_rule( + get_entrance("REGION_EVER_GRANDE_CITY/SOUTH -> REGION_EVER_GRANDE_CITY/SEA"), + can_surf + ) + + # Victory Road + set_rule( + get_entrance("REGION_VICTORY_ROAD_B1F/SOUTH_WEST_MAIN -> REGION_VICTORY_ROAD_B1F/SOUTH_WEST_LADDER_UP"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B1F/SOUTH_WEST_LADDER_UP -> REGION_VICTORY_ROAD_B1F/SOUTH_WEST_MAIN"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B1F/MAIN_UPPER -> REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST -> REGION_VICTORY_ROAD_B1F/MAIN_LOWER_WEST"), + can_rock_smash + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B1F/MAIN_LOWER_WEST -> REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B1F/MAIN_LOWER_WEST -> REGION_VICTORY_ROAD_B1F/MAIN_UPPER"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B2F/LOWER_WEST -> REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B2F/LOWER_WEST_ISLAND -> REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B2F/LOWER_EAST -> REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER -> REGION_VICTORY_ROAD_B2F/UPPER_WATER"), + can_waterfall + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER -> REGION_VICTORY_ROAD_B2F/UPPER_WATER"), + can_waterfall + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B2F/UPPER -> REGION_VICTORY_ROAD_B2F/UPPER_WATER"), + can_surf + ) + set_rule( + get_entrance("REGION_VICTORY_ROAD_B2F/UPPER -> REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER"), + can_surf + ) + + # Pokemon League + if world.options.elite_four_requirement == EliteFourRequirement.option_badges: + set_rule( + get_entrance("REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/MAIN -> REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/BEHIND_BADGE_CHECKERS"), + lambda state: state.has_group("Badges", world.player, world.options.elite_four_count.value) + ) + else: + set_rule( + get_entrance("REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/MAIN -> REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/BEHIND_BADGE_CHECKERS"), + lambda state: defeated_n_gym_leaders(state, world.options.elite_four_count.value) + ) + + # Battle Frontier + # set_rule( + # get_entrance("REGION_BATTLE_FRONTIER_OUTSIDE_WEST/DOCK -> REGION_LILYCOVE_CITY_HARBOR/MAIN"), + # lambda state: state.has("S.S. Ticket", world.player) and + # (state.has("EVENT_DEFEAT_CHAMPION", world.player) or world.options.enable_ferry.value == Toggle.option_true) + # ) + # set_rule( + # get_entrance("REGION_BATTLE_FRONTIER_OUTSIDE_WEST/DOCK -> REGION_SLATEPORT_CITY_HARBOR/MAIN"), + # lambda state: state.has("S.S. Ticket", world.player) and + # (state.has("EVENT_DEFEAT_CHAMPION", world.player) or world.options.enable_ferry.value == Toggle.option_true) + # ) + # set_rule( + # get_entrance("REGION_BATTLE_FRONTIER_OUTSIDE_WEST/CAVE_ENTRANCE -> REGION_BATTLE_FRONTIER_OUTSIDE_WEST/WATER"), + # can_surf + # ) + # set_rule( + # get_entrance("REGION_BATTLE_FRONTIER_OUTSIDE_EAST/MAIN -> REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL"), + # lambda state: state.has("Wailmer Pail", world.player) and can_surf(state) + # ) + # set_rule( + # get_entrance("REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL -> REGION_BATTLE_FRONTIER_OUTSIDE_EAST/MAIN"), + # lambda state: state.has("ITEM_WAILMER_PAIL", world.player) + # ) + # set_rule( + # get_entrance("REGION_BATTLE_FRONTIER_OUTSIDE_EAST/WATER -> REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL"), + # can_waterfall + # ) + + # Overworld Items + if world.options.overworld_items: + # Route 103 + set_rule( + get_location("ITEM_ROUTE_103_PP_UP"), + can_cut + ) + set_rule( + get_location("ITEM_ROUTE_103_GUARD_SPEC"), + can_cut + ) + + # Route 104 + set_rule( + get_location("ITEM_ROUTE_104_X_ACCURACY"), + lambda state: can_surf(state) or can_cut(state) + ) + set_rule( + get_location("ITEM_ROUTE_104_PP_UP"), + can_surf + ) + + # Route 117 + set_rule( + get_location("ITEM_ROUTE_117_REVIVE"), + can_cut + ) + + # Route 114 + set_rule( + get_location("ITEM_ROUTE_114_PROTEIN"), + can_rock_smash + ) + + # Safari Zone + set_rule( + get_location("ITEM_SAFARI_ZONE_NORTH_WEST_TM22"), + can_surf + ) + set_rule( + get_location("ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE"), + can_surf + ) + set_rule( + get_location("ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL"), + can_surf + ) + + # Victory Road + set_rule( + get_location("ITEM_VICTORY_ROAD_B1F_FULL_RESTORE"), + lambda state: can_rock_smash(state) and can_strength(state) + ) + + # Hidden Items + if world.options.hidden_items: + # Route 120 + set_rule( + get_location("HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1"), + can_cut + ) + + # Route 121 + set_rule( + get_location("HIDDEN_ITEM_ROUTE_121_NUGGET"), + can_cut + ) + + # NPC Gifts + if world.options.npc_gifts: + # Littleroot Town + set_rule( + get_location("NPC_GIFT_RECEIVED_AMULET_COIN"), + lambda state: state.has("EVENT_TALK_TO_MR_STONE", world.player) and state.has("Balance Badge", world.player) + ) + + # Petalburg City + set_rule( + get_location("NPC_GIFT_RECEIVED_TM36"), + lambda state: state.has("EVENT_DEFEAT_NORMAN", world.player) + ) + + # Route 104 + set_rule( + get_location("NPC_GIFT_RECEIVED_WHITE_HERB"), + lambda state: state.has("Dynamo Badge", world.player) and state.has("EVENT_MEET_FLOWER_SHOP_OWNER", world.player) + ) + + # Devon Corp + set_rule( + get_location("NPC_GIFT_RECEIVED_EXP_SHARE"), + lambda state: state.has("EVENT_DELIVER_LETTER", world.player) + ) + + # Slateport City + set_rule( + get_location("NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH"), + lambda state: state.has("EVENT_AQUA_STEALS_SUBMARINE", world.player) + and state.has("Scanner", world.player) + and state.has("Mind Badge", world.player) + ) + set_rule( + get_location("NPC_GIFT_RECEIVED_DEEP_SEA_SCALE"), + lambda state: state.has("EVENT_AQUA_STEALS_SUBMARINE", world.player) + and state.has("Scanner", world.player) + and state.has("Mind Badge", world.player) + ) + + # Route 116 + set_rule( + get_location("NPC_GIFT_RECEIVED_REPEAT_BALL"), + lambda state: state.has("EVENT_RESCUE_CAPT_STERN", world.player) + ) + + # Mauville City + set_rule( + get_location("NPC_GIFT_GOT_TM24_FROM_WATTSON"), + lambda state: state.has("EVENT_DEFEAT_NORMAN", world.player) and state.has("EVENT_TURN_OFF_GENERATOR", world.player) + ) + set_rule( + get_location("NPC_GIFT_RECEIVED_COIN_CASE"), + lambda state: state.has("EVENT_BUY_HARBOR_MAIL", world.player) + ) + + # Fallarbor Town + set_rule( + get_location("NPC_GIFT_RECEIVED_TM27"), + lambda state: state.has("EVENT_RECOVER_METEORITE", world.player) and state.has("Meteorite", world.player) + ) + + # Fortree City + set_rule( + get_location("NPC_GIFT_RECEIVED_MENTAL_HERB"), + lambda state: state.has("EVENT_WINGULL_QUEST_2", world.player) + ) + + # Ferry Items + if world.options.enable_ferry: + set_rule( + get_location("NPC_GIFT_RECEIVED_SS_TICKET"), + lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) + ) + set_rule( + get_entrance("REGION_SLATEPORT_CITY_HARBOR/MAIN -> REGION_SS_TIDAL_CORRIDOR/MAIN"), + lambda state: state.has("S.S. Ticket", world.player) + ) + set_rule( + get_entrance("REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_SS_TIDAL_CORRIDOR/MAIN"), + lambda state: state.has("S.S. Ticket", world.player) + ) + + # Add Itemfinder requirement to hidden items + if world.options.require_itemfinder: + for location in world.multiworld.get_locations(world.player): + if location.tags is not None and "HiddenItem" in location.tags: + add_rule( + location, + lambda state: state.has("Itemfinder", world.player) + ) + + # Add Flash requirements to dark caves + if world.options.require_flash: + # Granite Cave + add_rule( + get_entrance("MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1"), + can_flash + ) + add_rule( + get_entrance("MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1"), + can_flash + ) + + # Victory Road + add_rule( + get_entrance("MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5"), + can_flash + ) + add_rule( + get_entrance("MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4"), + can_flash + ) + add_rule( + get_entrance("MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2"), + can_flash + ) + add_rule( + get_entrance("MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1"), + can_flash + ) + add_rule( + get_entrance("MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2"), + can_flash + ) + add_rule( + get_entrance("MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3"), + can_flash + ) + add_rule( + get_entrance("MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0"), + can_flash + ) + add_rule( + get_entrance("MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6"), + can_flash + ) + add_rule( + get_entrance("MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1"), + can_flash + ) + add_rule( + get_entrance("MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0"), + can_flash + ) + add_rule( + get_entrance("MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3"), + can_flash + ) diff --git a/worlds/pokemon_emerald/sanity_check.py b/worlds/pokemon_emerald/sanity_check.py new file mode 100644 index 000000000000..58f9b1ef4d86 --- /dev/null +++ b/worlds/pokemon_emerald/sanity_check.py @@ -0,0 +1,352 @@ +""" +Looks through data object to double-check it makes sense. Will fail for missing or duplicate definitions or +duplicate claims and give warnings for unused and unignored locations or warps. +""" +import logging +from typing import List + +from .data import data + + +_ignorable_locations = { + # Trick House + "HIDDEN_ITEM_TRICK_HOUSE_NUGGET", + "ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL", + "ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL", + "ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL", + "ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL", + "ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL", + "ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL", + "ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL", + "ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL", + "ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL", + + # Battle Frontier + "ITEM_ARTISAN_CAVE_1F_CARBOS", + "ITEM_ARTISAN_CAVE_B1F_HP_UP", + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM", + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON", + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN", + "HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC", + + # Event islands + "HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH" +} + +_ignorable_warps = { + # Trick House + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:2/MAP_ROUTE110_TRICK_HOUSE_END:0!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:2/MAP_ROUTE110_TRICK_HOUSE_END:0!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:2/MAP_ROUTE110_TRICK_HOUSE_END:0!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:2/MAP_ROUTE110_TRICK_HOUSE_END:0!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:2/MAP_ROUTE110_TRICK_HOUSE_END:0!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9", + "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:2/MAP_ROUTE110_TRICK_HOUSE_END:0!", + "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:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5", + "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:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!", + "MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:2/MAP_ROUTE110_TRICK_HOUSE_END:0!", + + # Department store elevator + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!", + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:3/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!", + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!", + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!", + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!", + "MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!", + + # Intro truck + "MAP_INSIDE_OF_TRUCK:0,1,2/MAP_DYNAMIC:-1!", + + # Battle Frontier + "MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1", + "MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!", + "MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1", + "MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!", + "MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2", + "MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2", + "MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2", + "MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0", + "MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:3/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0!", + "MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2", + "MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0", + "MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0", + "MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3", + "MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2", + "MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0", + "MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0", + "MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6", + "MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5", + "MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3", + "MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9", + "MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6", + "MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7", + "MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8", + "MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7", + "MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10", + "MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11", + "MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0", + "MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1", + "MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12", + "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_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4", + "MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8", + "MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9", + "MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5", + + "MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13", + "MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1", + "MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10", + "MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1", + + # Terra Cave and Marine Cave + "MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!", + "MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1", + "MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0", + "MAP_ROUTE113:1/MAP_TERRA_CAVE_ENTRANCE:0!", + "MAP_ROUTE113:2/MAP_TERRA_CAVE_ENTRANCE:0!", + "MAP_ROUTE114:3/MAP_TERRA_CAVE_ENTRANCE:0!", + "MAP_ROUTE114:4/MAP_TERRA_CAVE_ENTRANCE:0!", + "MAP_ROUTE115:1/MAP_TERRA_CAVE_ENTRANCE:0!", + "MAP_ROUTE115:2/MAP_TERRA_CAVE_ENTRANCE:0!", + "MAP_ROUTE116:3/MAP_TERRA_CAVE_ENTRANCE:0!", + "MAP_ROUTE116:4/MAP_TERRA_CAVE_ENTRANCE:0!", + "MAP_ROUTE118:0/MAP_TERRA_CAVE_ENTRANCE:0!", + "MAP_ROUTE118:1/MAP_TERRA_CAVE_ENTRANCE:0!", + + "MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!", + "MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0", + "MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0", + "MAP_UNDERWATER_ROUTE105:0/MAP_UNDERWATER_MARINE_CAVE:0!", + "MAP_UNDERWATER_ROUTE105:1/MAP_UNDERWATER_MARINE_CAVE:0!", + "MAP_UNDERWATER_ROUTE125:0/MAP_UNDERWATER_MARINE_CAVE:0!", + "MAP_UNDERWATER_ROUTE125:1/MAP_UNDERWATER_MARINE_CAVE:0!", + "MAP_UNDERWATER_ROUTE127:0/MAP_UNDERWATER_MARINE_CAVE:0!", + "MAP_UNDERWATER_ROUTE127:1/MAP_UNDERWATER_MARINE_CAVE:0!", + "MAP_UNDERWATER_ROUTE129:0/MAP_UNDERWATER_MARINE_CAVE:0!", + "MAP_UNDERWATER_ROUTE129:1/MAP_UNDERWATER_MARINE_CAVE:0!", + + # Event islands + "MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0", + "MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0", + + "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_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1", + "MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1", + + "MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0", + "MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1", + "MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0", + "MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2", + "MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0", + "MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1", + "MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0", + "MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1", + "MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0", + "MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1", + "MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0", + "MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1", + "MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0", + "MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1", + "MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0", + "MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1", + "MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0", + "MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1", + "MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0", + "MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1", + "MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0", + "MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1", + "MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1", + "MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0", + "MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1", + "MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0", + "MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1", + "MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0", + "MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1", + "MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0", + "MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1", + "MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0", + "MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0", + "MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1", + "MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK: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:1/MAP_NAVEL_ROCK_UP3:0", + "MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1", + "MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0", + "MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1", + "MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0", + + # Secret bases + "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_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_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_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!", + + # Multiplayer rooms + "MAP_RECORD_CORNER:0,1,2,3/MAP_DYNAMIC:-1!", + + "MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!", + "MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_PETALBURG_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:1/MAP_UNION_ROOM:0!", + "MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_OLDALE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_FORTREE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + "MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!", + + "MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!", + "MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_PETALBURG_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:2/MAP_TRADE_CENTER:0!", + "MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_OLDALE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_FORTREE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + "MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!", + + "MAP_BATTLE_COLOSSEUM_2P:0,1/MAP_DYNAMIC:-1!", + "MAP_BATTLE_COLOSSEUM_4P:0,1,2,3/MAP_DYNAMIC:-1!", + + # Unused content + "MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:0/MAP_CAVE_OF_ORIGIN_1F: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:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1: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:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1", + "MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:1/MAP_CAVE_OF_ORIGIN_B1F:0!", + "MAP_LILYCOVE_CITY_UNUSED_MART:0,1/MAP_LILYCOVE_CITY:0!" +} + + +def validate_regions() -> bool: + error_messages: List[str] = [] + warn_messages: List[str] = [] + failed = False + + def error(message: str) -> None: + nonlocal failed + failed = True + error_messages.append(message) + + def warn(message: str) -> None: + warn_messages.append(message) + + # Check regions + for name, region in data.regions.items(): + for region_exit in region.exits: + if region_exit not in data.regions: + error(f"Pokemon Emerald: Region [{region_exit}] referenced by [{name}] was not defined") + + # Check warps + for warp_source, warp_dest in data.warp_map.items(): + if warp_source in _ignorable_warps: + continue + + if warp_dest is None: + error(f"Pokemon Emerald: Warp [{warp_source}] has no destination") + elif not data.warps[warp_dest].connects_to(data.warps[warp_source]) and not data.warps[warp_source].is_one_way: + error(f"Pokemon Emerald: Warp [{warp_source}] appears to be a one-way warp but was not marked as one") + + # Check locations + claimed_locations = [location for region in data.regions.values() for location in region.locations] + claimed_locations_set = set() + for location_name in claimed_locations: + if location_name in claimed_locations_set: + error(f"Pokemon Emerald: Location [{location_name}] was claimed by multiple regions") + claimed_locations_set.add(location_name) + + for location_name in data.locations: + if location_name not in claimed_locations and location_name not in _ignorable_locations: + warn(f"Pokemon Emerald: Location [{location_name}] was not claimed by any region") + + warn_messages.sort() + error_messages.sort() + + for message in warn_messages: + logging.warning(message) + for message in error_messages: + logging.error(message) + + logging.debug("Pokemon Emerald sanity check done. Found %s errors and %s warnings.", len(error_messages), len(warn_messages)) + + return not failed diff --git a/worlds/pokemon_emerald/test/__init__.py b/worlds/pokemon_emerald/test/__init__.py new file mode 100644 index 000000000000..84ce64003d57 --- /dev/null +++ b/worlds/pokemon_emerald/test/__init__.py @@ -0,0 +1,5 @@ +from test.TestBase import WorldTestBase + + +class PokemonEmeraldTestBase(WorldTestBase): + game = "Pokemon Emerald" diff --git a/worlds/pokemon_emerald/test/test_accessibility.py b/worlds/pokemon_emerald/test/test_accessibility.py new file mode 100644 index 000000000000..da3ca058beba --- /dev/null +++ b/worlds/pokemon_emerald/test/test_accessibility.py @@ -0,0 +1,209 @@ +from Options import Toggle + +from . import PokemonEmeraldTestBase +from ..util import location_name_to_label +from ..options import NormanRequirement + + +class TestBasic(PokemonEmeraldTestBase): + def test_always_accessible(self) -> None: + self.assertTrue(self.can_reach_location(location_name_to_label("ITEM_ROUTE_102_POTION"))) + self.assertTrue(self.can_reach_location(location_name_to_label("ITEM_ROUTE_115_SUPER_POTION"))) + + +class TestScorchedSlabPond(PokemonEmeraldTestBase): + options = { + "enable_ferry": Toggle.option_true, + "require_flash": Toggle.option_false + } + + def test_with_neither(self) -> None: + self.collect_by_name(["S.S. Ticket", "Letter", "Stone Badge", "HM01 Cut"]) + self.assertTrue(self.can_reach_region("REGION_ROUTE120/NORTH")) + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_ROUTE_120_NEST_BALL"))) + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_SCORCHED_SLAB_TM11"))) + + def test_with_surf(self) -> None: + self.collect_by_name(["S.S. Ticket", "Letter", "Stone Badge", "HM01 Cut", "HM03 Surf", "Balance Badge"]) + self.assertTrue(self.can_reach_region("REGION_ROUTE120/NORTH")) + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_ROUTE_120_NEST_BALL"))) + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_SCORCHED_SLAB_TM11"))) + + def test_with_scope(self) -> None: + self.collect_by_name(["S.S. Ticket", "Letter", "Stone Badge", "HM01 Cut", "Devon Scope"]) + self.assertTrue(self.can_reach_region("REGION_ROUTE120/NORTH")) + self.assertTrue(self.can_reach_location(location_name_to_label("ITEM_ROUTE_120_NEST_BALL"))) + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_SCORCHED_SLAB_TM11"))) + + def test_with_both(self) -> None: + self.collect_by_name(["S.S. Ticket", "Letter", "Stone Badge", "HM01 Cut", "Devon Scope", "HM03 Surf", "Balance Badge"]) + self.assertTrue(self.can_reach_region("REGION_ROUTE120/NORTH")) + self.assertTrue(self.can_reach_location(location_name_to_label("ITEM_ROUTE_120_NEST_BALL"))) + self.assertTrue(self.can_reach_location(location_name_to_label("ITEM_SCORCHED_SLAB_TM11"))) + + +class TestSurf(PokemonEmeraldTestBase): + options = { + "npc_gifts": Toggle.option_true + } + + def test_inaccessible_with_no_surf(self) -> None: + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_PETALBURG_CITY_ETHER"))) + self.assertFalse(self.can_reach_location(location_name_to_label("NPC_GIFT_RECEIVED_SOOTHE_BELL"))) + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_LILYCOVE_CITY_MAX_REPEL"))) + self.assertFalse(self.can_reach_entrance("REGION_ROUTE118/WATER -> REGION_ROUTE118/EAST")) + self.assertFalse(self.can_reach_entrance("REGION_ROUTE119/UPPER -> REGION_FORTREE_CITY/MAIN")) + self.assertFalse(self.can_reach_entrance("MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0")) + + def test_accessible_with_surf_only(self) -> None: + self.collect_by_name(["HM03 Surf", "Balance Badge"]) + self.assertTrue(self.can_reach_location(location_name_to_label("ITEM_PETALBURG_CITY_ETHER"))) + self.assertTrue(self.can_reach_location(location_name_to_label("NPC_GIFT_RECEIVED_SOOTHE_BELL"))) + self.assertTrue(self.can_reach_location(location_name_to_label("ITEM_LILYCOVE_CITY_MAX_REPEL"))) + self.assertTrue(self.can_reach_entrance("REGION_ROUTE118/WATER -> REGION_ROUTE118/EAST")) + self.assertTrue(self.can_reach_entrance("REGION_ROUTE119/UPPER -> REGION_FORTREE_CITY/MAIN")) + self.assertTrue(self.can_reach_entrance("MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0")) + self.assertTrue(self.can_reach_location(location_name_to_label("BADGE_4"))) + + +class TestFreeFly(PokemonEmeraldTestBase): + options = { + "npc_gifts": Toggle.option_true, + "free_fly_location": Toggle.option_true + } + + def setUp(self) -> None: + super(PokemonEmeraldTestBase, self).setUp() + + # Swap free fly to Sootopolis + free_fly_location = self.multiworld.get_location("FREE_FLY_LOCATION", 1) + free_fly_location.item = None + free_fly_location.place_locked_item(self.multiworld.worlds[1].create_event("EVENT_VISITED_SOOTOPOLIS_CITY")) + + def test_sootopolis_gift_inaccessible_with_no_surf(self) -> None: + self.collect_by_name(["HM02 Fly", "Feather Badge"]) + self.assertFalse(self.can_reach_location(location_name_to_label("NPC_GIFT_RECEIVED_TM31"))) + + def test_sootopolis_gift_accessible_with_surf(self) -> None: + self.collect_by_name(["HM03 Surf", "Balance Badge", "HM02 Fly", "Feather Badge"]) + self.assertTrue(self.can_reach_location(location_name_to_label("NPC_GIFT_RECEIVED_TM31"))) + + +class TestFerry(PokemonEmeraldTestBase): + options = { + "npc_gifts": Toggle.option_true, + "enable_ferry": Toggle.option_true + } + + def test_inaccessible_with_no_items(self) -> None: + self.assertFalse(self.can_reach_location(location_name_to_label("NPC_GIFT_RECEIVED_SOOTHE_BELL"))) + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_LILYCOVE_CITY_MAX_REPEL"))) + + def test_inaccessible_with_only_slateport_access(self) -> None: + self.collect_by_name(["HM06 Rock Smash", "Dynamo Badge", "Acro Bike"]) + self.assertTrue(self.can_reach_location(location_name_to_label("NPC_GIFT_RECEIVED_SOOTHE_BELL"))) + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_LILYCOVE_CITY_MAX_REPEL"))) + + def test_accessible_with_slateport_access_and_ticket(self) -> None: + self.collect_by_name(["HM06 Rock Smash", "Dynamo Badge", "Acro Bike", "S.S. Ticket"]) + self.assertTrue(self.can_reach_location(location_name_to_label("NPC_GIFT_RECEIVED_SOOTHE_BELL"))) + self.assertTrue(self.can_reach_location(location_name_to_label("ITEM_LILYCOVE_CITY_MAX_REPEL"))) + + +class TestExtraBouldersOn(PokemonEmeraldTestBase): + options = { + "extra_boulders": Toggle.option_true + } + + def test_inaccessible_with_no_items(self) -> None: + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_ROUTE_115_PP_UP"))) + + def test_inaccessible_with_surf_only(self) -> None: + self.collect_by_name(["HM03 Surf", "Balance Badge"]) + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_ROUTE_115_PP_UP"))) + + def test_accessible_with_surf_and_strength(self) -> None: + self.collect_by_name(["HM03 Surf", "Balance Badge", "HM04 Strength", "Heat Badge"]) + self.assertTrue(self.can_reach_location(location_name_to_label("ITEM_ROUTE_115_PP_UP"))) + + +class TestExtraBouldersOff(PokemonEmeraldTestBase): + options = { + "extra_boulders": Toggle.option_false + } + + def test_inaccessible_with_no_items(self) -> None: + self.assertFalse(self.can_reach_location(location_name_to_label("ITEM_ROUTE_115_PP_UP"))) + + def test_accessible_with_surf_only(self) -> None: + self.collect_by_name(["HM03 Surf", "Balance Badge"]) + self.assertTrue(self.can_reach_location(location_name_to_label("ITEM_ROUTE_115_PP_UP"))) + + +class TestNormanRequirement1(PokemonEmeraldTestBase): + options = { + "norman_requirement": NormanRequirement.option_badges, + "norman_count": 0 + } + + def test_accessible_with_no_items(self) -> None: + self.assertTrue(self.can_reach_location(location_name_to_label("BADGE_5"))) + + +class TestNormanRequirement2(PokemonEmeraldTestBase): + options = { + "norman_requirement": NormanRequirement.option_badges, + "norman_count": 4 + } + + def test_inaccessible_with_no_items(self) -> None: + self.assertFalse(self.can_reach_location(location_name_to_label("BADGE_5"))) + + def test_accessible_with_enough_badges(self) -> None: + self.collect_by_name(["Stone Badge", "Knuckle Badge", "Feather Badge", "Balance Badge"]) + self.assertTrue(self.can_reach_location(location_name_to_label("BADGE_5"))) + + +class TestNormanRequirement3(PokemonEmeraldTestBase): + options = { + "norman_requirement": NormanRequirement.option_gyms, + "norman_count": 0 + } + + def test_accessible_with_no_items(self) -> None: + self.assertTrue(self.can_reach_location(location_name_to_label("BADGE_5"))) + + +class TestNormanRequirement4(PokemonEmeraldTestBase): + options = { + "norman_requirement": NormanRequirement.option_gyms, + "norman_count": 4 + } + + def test_inaccessible_with_no_items(self) -> None: + self.assertFalse(self.can_reach_location(location_name_to_label("BADGE_5"))) + + def test_accessible_with_reachable_gyms(self) -> None: + self.collect_by_name(["HM03 Surf", "Balance Badge"]) # Reaches Roxanne, Brawley, Wattson, and Flannery + self.assertTrue(self.can_reach_location(location_name_to_label("BADGE_5"))) + + +class TestVictoryRoad(PokemonEmeraldTestBase): + options = { + "elite_four_requirement": NormanRequirement.option_badges, + "elite_four_count": 0, + "remove_roadblocks": {"Lilycove City Wailmer"} + } + + def test_accessible_with_specific_hms(self) -> None: + self.assertFalse(self.can_reach_location("EVENT_DEFEAT_CHAMPION")) + self.collect_by_name(["HM03 Surf", "Balance Badge"]) + self.assertFalse(self.can_reach_location("EVENT_DEFEAT_CHAMPION")) + self.collect_by_name(["HM07 Waterfall", "Rain Badge"]) + self.assertFalse(self.can_reach_location("EVENT_DEFEAT_CHAMPION")) + self.collect_by_name(["HM04 Strength", "Heat Badge"]) + self.assertFalse(self.can_reach_location("EVENT_DEFEAT_CHAMPION")) + self.collect_by_name(["HM06 Rock Smash", "Dynamo Badge"]) + self.assertFalse(self.can_reach_location("EVENT_DEFEAT_CHAMPION")) + self.collect_by_name(["HM05 Flash", "Knuckle Badge"]) + self.assertTrue(self.can_reach_location("EVENT_DEFEAT_CHAMPION")) diff --git a/worlds/pokemon_emerald/test/test_warps.py b/worlds/pokemon_emerald/test/test_warps.py new file mode 100644 index 000000000000..75a2417dfbe6 --- /dev/null +++ b/worlds/pokemon_emerald/test/test_warps.py @@ -0,0 +1,21 @@ +from test.TestBase import TestBase +from ..data import Warp + + +class TestWarps(TestBase): + def test_warps_connect_ltr(self) -> None: + # 2-way + self.assertTrue(Warp("FAKE_MAP_A:0/FAKE_MAP_B:0").connects_to(Warp("FAKE_MAP_B:0/FAKE_MAP_A:0"))) + self.assertTrue(Warp("FAKE_MAP_A:0/FAKE_MAP_B:2").connects_to(Warp("FAKE_MAP_B:2/FAKE_MAP_A:0"))) + self.assertTrue(Warp("FAKE_MAP_A:0,1/FAKE_MAP_B:2").connects_to(Warp("FAKE_MAP_B:2/FAKE_MAP_A:0"))) + self.assertTrue(Warp("FAKE_MAP_A:0/FAKE_MAP_B:2").connects_to(Warp("FAKE_MAP_B:2,3/FAKE_MAP_A:0"))) + + # 1-way + self.assertTrue(Warp("FAKE_MAP_A:0/FAKE_MAP_B:2!").connects_to(Warp("FAKE_MAP_B:2/FAKE_MAP_A:3"))) + self.assertTrue(Warp("FAKE_MAP_A:0,1/FAKE_MAP_B:2!").connects_to(Warp("FAKE_MAP_B:2/FAKE_MAP_A:3"))) + self.assertTrue(Warp("FAKE_MAP_A:0/FAKE_MAP_B:2!").connects_to(Warp("FAKE_MAP_B:2,3/FAKE_MAP_A:3"))) + + # Invalid + self.assertFalse(Warp("FAKE_MAP_A:0/FAKE_MAP_B:2").connects_to(Warp("FAKE_MAP_B:4/FAKE_MAP_A:0"))) + self.assertFalse(Warp("FAKE_MAP_A:0,4/FAKE_MAP_B:2").connects_to(Warp("FAKE_MAP_B:4/FAKE_MAP_A:0"))) + self.assertFalse(Warp("FAKE_MAP_A:0,4/FAKE_MAP_B:2").connects_to(Warp("FAKE_MAP_C:2/FAKE_MAP_A:0"))) diff --git a/worlds/pokemon_emerald/util.py b/worlds/pokemon_emerald/util.py new file mode 100644 index 000000000000..781cfd47bc9d --- /dev/null +++ b/worlds/pokemon_emerald/util.py @@ -0,0 +1,19 @@ +from typing import List + +from .data import data + + +def location_name_to_label(name: str) -> str: + return data.locations[name].label + + +def int_to_bool_array(num: int) -> List[bool]: + binary_string = format(num, '064b') + bool_array = [bit == '1' for bit in reversed(binary_string)] + return bool_array + + +def bool_array_to_int(bool_array: List[bool]) -> int: + binary_string = ''.join(['1' if bit else '0' for bit in reversed(bool_array)]) + num = int(binary_string, 2) + return num diff --git a/worlds/raft/__init__.py b/worlds/raft/__init__.py index fec60c3bd51b..8e4eda09e10f 100644 --- a/worlds/raft/__init__.py +++ b/worlds/raft/__init__.py @@ -1,5 +1,4 @@ import typing -import random from .Locations import location_table, lookup_name_to_id as locations_lookup_name_to_id from .Items import (createResourcePackName, item_table, progressive_table, progressive_item_list, @@ -100,7 +99,7 @@ def create_items(self): extraItemNamePool.append(item["name"]) if (len(extraItemNamePool) > 0): - for randomItem in random.choices(extraItemNamePool, k=extras): + for randomItem in self.random.choices(extraItemNamePool, k=extras): raft_item = self.create_item_replaceAsNecessary(randomItem) pool.append(raft_item) @@ -194,7 +193,7 @@ def pre_fill(self): previousLocation = "RadioTower" while (len(availableLocationList) > 0): if (len(availableLocationList) > 1): - currentLocation = availableLocationList[random.randint(0, len(availableLocationList) - 2)] + currentLocation = availableLocationList[self.random.randint(0, len(availableLocationList) - 2)] else: currentLocation = availableLocationList[0] # Utopia (only one left in list) availableLocationList.remove(currentLocation) @@ -212,7 +211,7 @@ def setLocationItem(self, location: str, itemName: str): def setLocationItemFromRegion(self, region: str, itemName: str): itemToUse = next(filter(lambda itm: itm.name == itemName, self.multiworld.raft_frequencyItemsPerPlayer[self.player])) self.multiworld.raft_frequencyItemsPerPlayer[self.player].remove(itemToUse) - location = random.choice(list(loc for loc in location_table if loc["region"] == region)) + location = self.random.choice(list(loc for loc in location_table if loc["region"] == region)) self.multiworld.get_location(location["name"], self.player).place_locked_item(itemToUse) def fill_slot_data(self): diff --git a/worlds/rogue_legacy/Presets.py b/worlds/rogue_legacy/Presets.py new file mode 100644 index 000000000000..a4284e9f7d34 --- /dev/null +++ b/worlds/rogue_legacy/Presets.py @@ -0,0 +1,61 @@ +from typing import Any, Dict + +from .Options import Architect, GoldGainMultiplier, Vendors + +rl_options_presets: Dict[str, Dict[str, Any]] = { + # Example preset using only literal values. + "Unknown Fate": { + "progression_balancing": "random", + "accessibility": "random", + "starting_gender": "random", + "starting_class": "random", + "new_game_plus": "random", + "fairy_chests_per_zone": "random", + "chests_per_zone": "random", + "universal_fairy_chests": "random", + "universal_chests": "random", + "vendors": "random", + "architect": "random", + "architect_fee": "random", + "disable_charon": "random", + "require_purchasing": "random", + "progressive_blueprints": "random", + "gold_gain_multiplier": "random", + "number_of_children": "random", + "free_diary_on_generation": "random", + "khidr": "random", + "alexander": "random", + "leon": "random", + "herodotus": "random", + "health_pool": "random", + "mana_pool": "random", + "attack_pool": "random", + "magic_damage_pool": "random", + "armor_pool": "random", + "equip_pool": "random", + "crit_chance_pool": "random", + "crit_damage_pool": "random", + "allow_default_names": False, + "death_link": "random", + }, + # A preset I actually use, using some literal values and some from the option itself. + "Limited Potential": { + "progression_balancing": "disabled", + "fairy_chests_per_zone": 2, + "starting_class": "random", + "chests_per_zone": 30, + "vendors": Vendors.option_normal, + "architect": Architect.option_disabled, + "gold_gain_multiplier": GoldGainMultiplier.option_half, + "number_of_children": 2, + "free_diary_on_generation": False, + "health_pool": 10, + "mana_pool": 10, + "attack_pool": 10, + "magic_damage_pool": 10, + "armor_pool": 5, + "equip_pool": 10, + "crit_chance_pool": 5, + "crit_damage_pool": 5, + } +} diff --git a/worlds/rogue_legacy/__init__.py b/worlds/rogue_legacy/__init__.py index 68a0c856c8ad..c5a8d71b5d63 100644 --- a/worlds/rogue_legacy/__init__.py +++ b/worlds/rogue_legacy/__init__.py @@ -5,6 +5,7 @@ from .Items import RLItem, RLItemData, event_item_table, get_items_by_category, item_table from .Locations import RLLocation, location_table from .Options import rl_options +from .Presets import rl_options_presets from .Regions import create_regions from .Rules import set_rules @@ -22,6 +23,7 @@ class RLWeb(WebWorld): )] bug_report_page = "https://github.com/ThePhar/RogueLegacyRandomizer/issues/new?assignees=&labels=bug&template=" \ "report-an-issue---.md&title=%5BIssue%5D" + options_presets = rl_options_presets class RLWorld(World): diff --git a/worlds/sa2b/AestheticData.py b/worlds/sa2b/AestheticData.py new file mode 100644 index 000000000000..f3699e81e0c4 --- /dev/null +++ b/worlds/sa2b/AestheticData.py @@ -0,0 +1,342 @@ + +chao_name_conversion = { + "!": 0x01, + "!": 0x02, + "#": 0x03, + "$": 0x04, + "%": 0x05, + "&": 0x06, + "\\": 0x07, + "(": 0x08, + ")": 0x09, + "*": 0x0A, + "+": 0x0B, + ",": 0x0C, + "-": 0x0D, + ".": 0x0E, + "/": 0x0F, + + "0": 0x10, + "1": 0x11, + "2": 0x12, + "3": 0x13, + "4": 0x14, + "5": 0x15, + "6": 0x16, + "7": 0x17, + "8": 0x18, + "9": 0x19, + ":": 0x1A, + ";": 0x1B, + "<": 0x1C, + "=": 0x1D, + ">": 0x1E, + "?": 0x1F, + + "@": 0x20, + "A": 0x21, + "B": 0x22, + "C": 0x23, + "D": 0x24, + "E": 0x25, + "F": 0x26, + "G": 0x27, + "H": 0x28, + "I": 0x29, + "J": 0x2A, + "K": 0x2B, + "L": 0x2C, + "M": 0x2D, + "N": 0x2E, + "O": 0x2F, + + "P": 0x30, + "Q": 0x31, + "R": 0x32, + "S": 0x33, + "T": 0x34, + "U": 0x35, + "V": 0x36, + "W": 0x37, + "X": 0x38, + "Y": 0x39, + "Z": 0x3A, + "[": 0x3B, + "¥": 0x3C, + "]": 0x3D, + "^": 0x3E, + "_": 0x3F, + + "`": 0x40, + "a": 0x41, + "b": 0x42, + "c": 0x43, + "d": 0x44, + "e": 0x45, + "f": 0x46, + "g": 0x47, + "h": 0x48, + "i": 0x49, + "j": 0x4A, + "k": 0x4B, + "l": 0x4C, + "m": 0x4D, + "n": 0x4E, + "o": 0x4F, + + "p": 0x50, + "q": 0x51, + "r": 0x52, + "s": 0x53, + "t": 0x54, + "u": 0x55, + "v": 0x56, + "w": 0x57, + "x": 0x58, + "y": 0x59, + "z": 0x5A, + "{": 0x5B, + "|": 0x5C, + "}": 0x5D, + "~": 0x5E, + " ": 0x5F, +} + +sample_chao_names = [ + "Aginah", + "Biter", + "Steve", + "Ryley", + "Watcher", + "Acrid", + "Sheik", + "Lunais", + "Samus", + "The Kid", + "Jack", + "Sir Lee", + "Viridian", + "Rouhi", + "Toad", + "Merit", + "Ridley", + "Hornet", + "Carl", + "Raynor", + "Dixie", + "Wolnir", + "Mario", + "Gary", + "Wayne", + "Kevin", + "J.J.", + "Maxim", + "Redento", + "Caesar", + "Abigail", + "Link", + "Ninja", + "Roxas", + "Marin", + "Yorgle", + "DLC", + "Mina", + "Sans", + "Lan", + "Rin", + "Doomguy", + "Guide", +] + +totally_real_item_names = [ + "Mallet", + "Lava Rod", + "Master Knife", + "Slippers", + "Spade", + + "Progressive Car Upgrade", + "Bonus Token", + + "Shortnail", + "Runmaster", + + "Courage Form", + "Auto Courage", + "Donald Defender", + "Goofy Blizzard", + "Ultimate Weapon", + + "Song of the Sky Whale", + "Gryphon Shoes", + "Wing Key", + "Strength Anklet", + + "Hairclip", + + "Key of Wisdom", + + "Baking", + "Progressive Block Mining", + + "Jar", + "Whistle of Space", + "Rito Tunic", + + "Kitchen Sink", + + "Rock Badge", + "Key Card", + "Pikachu", + "Eevee", + "HM02 Strength", + + "Progressive Astromancers", + "Progressive Chefs", + "The Living Safe", + "Lady Quinn", + + "Dio's Worst Enemy", + + "Pink Chaos Emerald", + "Black Chaos Emerald", + "Tails - Large Cannon", + "Eggman - Bazooka", + "Eggman - Booster", + "Knuckles - Shades", + "Sonic - Magic Shoes", + "Shadow - Bounce Bracelet", + "Rouge - Air Necklace", + "Big Key (Eggman's Pyramid)", + + "Sensor Bunker", + "Phantom", + "Soldier", + + "Plasma Suit", + "Gravity Beam", + "Hi-Jump Ball", + + "Cannon Unlock LLL", + "Feather Cap", + + "Progressive Yoshi", + "Purple Switch Palace", + "Cape Feather", + + "Cane of Bryan", + + "Van Repair", + "Autumn", + "Galaxy Knife", + "Green Cabbage Seeds", + + "Timespinner Cog 1", + + "Ladder", + + "Visible Dots", +] + +all_exits = [ + 0x00, # Lobby to Neutral + 0x01, # Lobby to Hero + 0x02, # Lobby to Dark + 0x03, # Lobby to Kindergarten + 0x04, # Neutral to Lobby + 0x05, # Neutral to Cave + 0x06, # Neutral to Transporter + 0x07, # Hero to Lobby + 0x08, # Hero to Transporter + 0x09, # Dark to Lobby + 0x0A, # Dark to Transporter + 0x0B, # Cave to Neutral + 0x0C, # Cave to Race + 0x0D, # Cave to Karate + 0x0E, # Race to Cave + 0x0F, # Karate to Cave + 0x10, # Transporter to Neutral + #0x11, # Transporter to Hero + #0x12, # Transporter to Dark + 0x13, # Kindergarten to Lobby +] + +all_destinations = [ + 0x07, # Lobby + 0x07, + 0x07, + 0x07, + 0x01, # Neutral + 0x01, + 0x01, + 0x02, # Hero + 0x02, + 0x03, # Dark + 0x03, + 0x09, # Cave + 0x09, + 0x09, + 0x05, # Chao Race + 0x0A, # Chao Karate + 0x0C, # Transporter + #0x0C, + #0x0C, + 0x06, # Kindergarten +] + +multi_rooms = [ + 0x07, + 0x01, + 0x02, + 0x03, + 0x09, +] + +single_rooms = [ + 0x05, + 0x0A, + 0x0C, + 0x06, +] + +room_to_exits_map = { + 0x07: [0x00, 0x01, 0x02, 0x03], + 0x01: [0x04, 0x05, 0x06], + 0x02: [0x07, 0x08], + 0x03: [0x09, 0x0A], + 0x09: [0x0B, 0x0C, 0x0D], + 0x05: [0x0E], + 0x0A: [0x0F], + 0x0C: [0x10],#, 0x11, 0x12], + 0x06: [0x13], +} + +exit_to_room_map = { + 0x00: 0x07, # Lobby to Neutral + 0x01: 0x07, # Lobby to Hero + 0x02: 0x07, # Lobby to Dark + 0x03: 0x07, # Lobby to Kindergarten + 0x04: 0x01, # Neutral to Lobby + 0x05: 0x01, # Neutral to Cave + 0x06: 0x01, # Neutral to Transporter + 0x07: 0x02, # Hero to Lobby + 0x08: 0x02, # Hero to Transporter + 0x09: 0x03, # Dark to Lobby + 0x0A: 0x03, # Dark to Transporter + 0x0B: 0x09, # Cave to Neutral + 0x0C: 0x09, # Cave to Race + 0x0D: 0x09, # Cave to Karate + 0x0E: 0x05, # Race to Cave + 0x0F: 0x0A, # Karate to Cave + 0x10: 0x0C, # Transporter to Neutral + #0x11: 0x0C, # Transporter to Hero + #0x12: 0x0C, # Transporter to Dark + 0x13: 0x06, # Kindergarten to Lobby +} + +valid_kindergarten_exits = [ + 0x04, # Neutral to Lobby + 0x05, # Neutral to Cave + 0x07, # Hero to Lobby + 0x09, # Dark to Lobby +] diff --git a/worlds/sa2b/GateBosses.py b/worlds/sa2b/GateBosses.py index e89d4c4557ef..76dd71fa3cd2 100644 --- a/worlds/sa2b/GateBosses.py +++ b/worlds/sa2b/GateBosses.py @@ -1,4 +1,6 @@ import typing +from BaseClasses import MultiWorld +from worlds.AutoWorld import World speed_characters_1 = "Sonic vs Shadow 1" speed_characters_2 = "Sonic vs Shadow 2" @@ -59,17 +61,17 @@ def boss_has_requirement(boss: int): return boss >= len(gate_bosses_no_requirements_table) -def get_gate_bosses(world, player: int): +def get_gate_bosses(multiworld: MultiWorld, world: World): selected_bosses: typing.List[int] = [] boss_gates: typing.List[int] = [] available_bosses: typing.List[str] = list(gate_bosses_no_requirements_table.keys()) - world.random.shuffle(available_bosses) + multiworld.random.shuffle(available_bosses) halfway = False - for x in range(world.number_of_level_gates[player]): - if (not halfway) and ((x + 1) / world.number_of_level_gates[player]) > 0.5: + for x in range(world.options.number_of_level_gates): + if (not halfway) and ((x + 1) / world.options.number_of_level_gates) > 0.5: available_bosses.extend(gate_bosses_with_requirements_table) - world.random.shuffle(available_bosses) + multiworld.random.shuffle(available_bosses) halfway = True selected_bosses.append(all_gate_bosses_table[available_bosses[0]]) boss_gates.append(x + 1) @@ -80,27 +82,27 @@ def get_gate_bosses(world, player: int): return bosses -def get_boss_rush_bosses(multiworld, player: int): +def get_boss_rush_bosses(multiworld: MultiWorld, world: World): - if multiworld.boss_rush_shuffle[player] == 0: + if world.options.boss_rush_shuffle == 0: boss_list_o = list(range(0, 16)) boss_list_s = [5, 2, 0, 10, 8, 4, 3, 1, 6, 13, 7, 11, 9, 15, 14, 12] return dict(zip(boss_list_o, boss_list_s)) - elif multiworld.boss_rush_shuffle[player] == 1: + elif world.options.boss_rush_shuffle == 1: boss_list_o = list(range(0, 16)) boss_list_s = boss_list_o.copy() multiworld.random.shuffle(boss_list_s) return dict(zip(boss_list_o, boss_list_s)) - elif multiworld.boss_rush_shuffle[player] == 2: + elif world.options.boss_rush_shuffle == 2: boss_list_o = list(range(0, 16)) boss_list_s = [multiworld.random.choice(boss_list_o) for i in range(0, 16)] if 10 not in boss_list_s: boss_list_s[multiworld.random.randint(0, 15)] = 10 return dict(zip(boss_list_o, boss_list_s)) - elif multiworld.boss_rush_shuffle[player] == 3: + elif world.options.boss_rush_shuffle == 3: boss_list_o = list(range(0, 16)) boss_list_s = [multiworld.random.choice(boss_list_o)] * len(boss_list_o) if 10 not in boss_list_s: diff --git a/worlds/sa2b/Items.py b/worlds/sa2b/Items.py index 2b862c66afbf..318a57f75394 100644 --- a/worlds/sa2b/Items.py +++ b/worlds/sa2b/Items.py @@ -22,7 +22,8 @@ def __init__(self, name, classification: ItemClassification, code: int = None, p # Separate tables for each type of item. emblems_table = { - ItemName.emblem: ItemData(0xFF0000, True), + ItemName.emblem: ItemData(0xFF0000, True), + ItemName.market_token: ItemData(0xFF001F, True), } upgrades_table = { @@ -82,6 +83,7 @@ def __init__(self, name, classification: ItemClassification, code: int = None, p ItemName.ice_trap: ItemData(0xFF0037, False, True), ItemName.slow_trap: ItemData(0xFF0038, False, True), ItemName.cutscene_trap: ItemData(0xFF0039, False, True), + ItemName.reverse_trap: ItemData(0xFF003A, False, True), ItemName.pong_trap: ItemData(0xFF0050, False, True), } @@ -96,6 +98,142 @@ def __init__(self, name, classification: ItemClassification, code: int = None, p ItemName.blue_emerald: ItemData(0xFF0046, True), } +eggs_table = { + ItemName.normal_egg: ItemData(0xFF0100, False), + ItemName.yellow_monotone_egg: ItemData(0xFF0101, False), + ItemName.white_monotone_egg: ItemData(0xFF0102, False), + ItemName.brown_monotone_egg: ItemData(0xFF0103, False), + ItemName.sky_blue_monotone_egg: ItemData(0xFF0104, False), + ItemName.pink_monotone_egg: ItemData(0xFF0105, False), + ItemName.blue_monotone_egg: ItemData(0xFF0106, False), + ItemName.grey_monotone_egg: ItemData(0xFF0107, False), + ItemName.green_monotone_egg: ItemData(0xFF0108, False), + ItemName.red_monotone_egg: ItemData(0xFF0109, False), + ItemName.lime_green_monotone_egg: ItemData(0xFF010A, False), + ItemName.purple_monotone_egg: ItemData(0xFF010B, False), + ItemName.orange_monotone_egg: ItemData(0xFF010C, False), + ItemName.black_monotone_egg: ItemData(0xFF010D, False), + + ItemName.yellow_twotone_egg: ItemData(0xFF010E, False), + ItemName.white_twotone_egg: ItemData(0xFF010F, False), + ItemName.brown_twotone_egg: ItemData(0xFF0110, False), + ItemName.sky_blue_twotone_egg: ItemData(0xFF0111, False), + ItemName.pink_twotone_egg: ItemData(0xFF0112, False), + ItemName.blue_twotone_egg: ItemData(0xFF0113, False), + ItemName.grey_twotone_egg: ItemData(0xFF0114, False), + ItemName.green_twotone_egg: ItemData(0xFF0115, False), + ItemName.red_twotone_egg: ItemData(0xFF0116, False), + ItemName.lime_green_twotone_egg: ItemData(0xFF0117, False), + ItemName.purple_twotone_egg: ItemData(0xFF0118, False), + ItemName.orange_twotone_egg: ItemData(0xFF0119, False), + ItemName.black_twotone_egg: ItemData(0xFF011A, False), + + ItemName.normal_shiny_egg: ItemData(0xFF011B, False), + ItemName.yellow_shiny_egg: ItemData(0xFF011C, False), + ItemName.white_shiny_egg: ItemData(0xFF011D, False), + ItemName.brown_shiny_egg: ItemData(0xFF011E, False), + ItemName.sky_blue_shiny_egg: ItemData(0xFF011F, False), + ItemName.pink_shiny_egg: ItemData(0xFF0120, False), + ItemName.blue_shiny_egg: ItemData(0xFF0121, False), + ItemName.grey_shiny_egg: ItemData(0xFF0122, False), + ItemName.green_shiny_egg: ItemData(0xFF0123, False), + ItemName.red_shiny_egg: ItemData(0xFF0124, False), + ItemName.lime_green_shiny_egg: ItemData(0xFF0125, False), + ItemName.purple_shiny_egg: ItemData(0xFF0126, False), + ItemName.orange_shiny_egg: ItemData(0xFF0127, False), + ItemName.black_shiny_egg: ItemData(0xFF0128, False), +} + +fruits_table = { + ItemName.chao_garden_fruit: ItemData(0xFF0200, False), + ItemName.hero_garden_fruit: ItemData(0xFF0201, False), + ItemName.dark_garden_fruit: ItemData(0xFF0202, False), + + ItemName.strong_fruit: ItemData(0xFF0203, False), + ItemName.tasty_fruit: ItemData(0xFF0204, False), + ItemName.hero_fruit: ItemData(0xFF0205, False), + ItemName.dark_fruit: ItemData(0xFF0206, False), + ItemName.round_fruit: ItemData(0xFF0207, False), + ItemName.triangle_fruit: ItemData(0xFF0208, False), + ItemName.square_fruit: ItemData(0xFF0209, False), + ItemName.heart_fruit: ItemData(0xFF020A, False), + ItemName.chao_fruit: ItemData(0xFF020B, False), + ItemName.smart_fruit: ItemData(0xFF020C, False), + + ItemName.orange_fruit: ItemData(0xFF020D, False), + ItemName.blue_fruit: ItemData(0xFF020E, False), + ItemName.pink_fruit: ItemData(0xFF020F, False), + ItemName.green_fruit: ItemData(0xFF0210, False), + ItemName.purple_fruit: ItemData(0xFF0211, False), + ItemName.yellow_fruit: ItemData(0xFF0212, False), + ItemName.red_fruit: ItemData(0xFF0213, False), + + ItemName.mushroom_fruit: ItemData(0xFF0214, False), + ItemName.super_mushroom_fruit: ItemData(0xFF0215, False), + ItemName.mint_candy_fruit: ItemData(0xFF0216, False), + ItemName.grapes_fruit: ItemData(0xFF0217, False), +} + +seeds_table = { + ItemName.strong_seed: ItemData(0xFF0300, False), + ItemName.tasty_seed: ItemData(0xFF0301, False), + ItemName.hero_seed: ItemData(0xFF0302, False), + ItemName.dark_seed: ItemData(0xFF0303, False), + ItemName.round_seed: ItemData(0xFF0304, False), + ItemName.triangle_seed: ItemData(0xFF0305, False), + ItemName.square_seed: ItemData(0xFF0306, False), +} + +hats_table = { + ItemName.pumpkin_hat: ItemData(0xFF0401, False), + ItemName.skull_hat: ItemData(0xFF0402, False), + ItemName.apple_hat: ItemData(0xFF0403, False), + ItemName.bucket_hat: ItemData(0xFF0404, False), + ItemName.empty_can_hat: ItemData(0xFF0405, False), + ItemName.cardboard_box_hat: ItemData(0xFF0406, False), + ItemName.flower_pot_hat: ItemData(0xFF0407, False), + ItemName.paper_bag_hat: ItemData(0xFF0408, False), + ItemName.pan_hat: ItemData(0xFF0409, False), + ItemName.stump_hat: ItemData(0xFF040A, False), + ItemName.watermelon_hat: ItemData(0xFF040B, False), + + ItemName.red_wool_beanie_hat: ItemData(0xFF040C, False), + ItemName.blue_wool_beanie_hat: ItemData(0xFF040D, False), + ItemName.black_wool_beanie_hat: ItemData(0xFF040E, False), + ItemName.pacifier_hat: ItemData(0xFF040F, False), +} + +animals_table = { + ItemName.animal_penguin: ItemData(0xFF0500, False), + ItemName.animal_seal: ItemData(0xFF0501, False), + ItemName.animal_otter: ItemData(0xFF0502, False), + ItemName.animal_rabbit: ItemData(0xFF0503, False), + ItemName.animal_cheetah: ItemData(0xFF0504, False), + ItemName.animal_warthog: ItemData(0xFF0505, False), + ItemName.animal_bear: ItemData(0xFF0506, False), + ItemName.animal_tiger: ItemData(0xFF0507, False), + ItemName.animal_gorilla: ItemData(0xFF0508, False), + ItemName.animal_peacock: ItemData(0xFF0509, False), + ItemName.animal_parrot: ItemData(0xFF050A, False), + ItemName.animal_condor: ItemData(0xFF050B, False), + ItemName.animal_skunk: ItemData(0xFF050C, False), + ItemName.animal_sheep: ItemData(0xFF050D, False), + ItemName.animal_raccoon: ItemData(0xFF050E, False), + ItemName.animal_halffish: ItemData(0xFF050F, False), + ItemName.animal_skeleton_dog: ItemData(0xFF0510, False), + ItemName.animal_bat: ItemData(0xFF0511, False), + ItemName.animal_dragon: ItemData(0xFF0512, False), + ItemName.animal_unicorn: ItemData(0xFF0513, False), + ItemName.animal_phoenix: ItemData(0xFF0514, False), +} + +chaos_drives_table = { + ItemName.chaos_drive_yellow: ItemData(0xFF0515, False), + ItemName.chaos_drive_green: ItemData(0xFF0516, False), + ItemName.chaos_drive_red: ItemData(0xFF0517, False), + ItemName.chaos_drive_purple: ItemData(0xFF0518, False), +} + event_table = { ItemName.maria: ItemData(0xFF001D, True), } @@ -107,12 +245,25 @@ def __init__(self, name, classification: ItemClassification, code: int = None, p **junk_table, **trap_table, **emeralds_table, + **eggs_table, + **fruits_table, + **seeds_table, + **hats_table, + **animals_table, + **chaos_drives_table, **event_table, } lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in item_table.items() if data.code} -item_groups: typing.Dict[str, str] = {"Chaos Emeralds": [item_name for item_name, data in emeralds_table.items()]} +item_groups: typing.Dict[str, str] = { + "Chaos Emeralds": list(emeralds_table.keys()), + "Eggs": list(eggs_table.keys()), + "Fruits": list(fruits_table.keys()), + "Seeds": list(seeds_table.keys()), + "Hats": list(hats_table.keys()), + "Traps": list(trap_table.keys()), +} ALTTPWorld.pedestal_credit_texts[item_table[ItemName.sonic_light_shoes].code] = "and the Soap Shoes" ALTTPWorld.pedestal_credit_texts[item_table[ItemName.shadow_air_shoes].code] = "and the Soap Shoes" diff --git a/worlds/sa2b/Locations.py b/worlds/sa2b/Locations.py index 461580bb6e39..c928e0c3890e 100644 --- a/worlds/sa2b/Locations.py +++ b/worlds/sa2b/Locations.py @@ -1,6 +1,7 @@ import typing from BaseClasses import Location, MultiWorld +from worlds.AutoWorld import World from .Names import LocationName from .Missions import stage_name_prefixes, mission_orders @@ -1066,6 +1067,7 @@ class SA2BLocation(Location): LocationName.final_rush_animal_11: 0xFF0C4F, LocationName.iron_gate_animal_11: 0xFF0C50, + LocationName.dry_lagoon_animal_11: 0xFF0C51, LocationName.sand_ocean_animal_11: 0xFF0C52, LocationName.radical_highway_animal_11: 0xFF0C53, LocationName.lost_colony_animal_11: 0xFF0C55, @@ -1241,7 +1243,7 @@ class SA2BLocation(Location): LocationName.boss_rush_16: 0xFF0114, } -chao_garden_beginner_location_table = { +chao_race_beginner_location_table = { LocationName.chao_race_crab_pool_1: 0xFF0200, LocationName.chao_race_crab_pool_2: 0xFF0201, LocationName.chao_race_crab_pool_3: 0xFF0202, @@ -1254,11 +1256,17 @@ class SA2BLocation(Location): LocationName.chao_race_block_canyon_1: 0xFF0209, LocationName.chao_race_block_canyon_2: 0xFF020A, LocationName.chao_race_block_canyon_3: 0xFF020B, +} - LocationName.chao_beginner_karate: 0xFF0300, +chao_karate_beginner_location_table = { + LocationName.chao_beginner_karate_1: 0xFF0300, + LocationName.chao_beginner_karate_2: 0xFF0301, + LocationName.chao_beginner_karate_3: 0xFF0302, + LocationName.chao_beginner_karate_4: 0xFF0303, + LocationName.chao_beginner_karate_5: 0xFF0304, } -chao_garden_intermediate_location_table = { +chao_race_intermediate_location_table = { LocationName.chao_race_challenge_1: 0xFF022A, LocationName.chao_race_challenge_2: 0xFF022B, LocationName.chao_race_challenge_3: 0xFF022C, @@ -1281,11 +1289,17 @@ class SA2BLocation(Location): LocationName.chao_race_dark_2: 0xFF023B, LocationName.chao_race_dark_3: 0xFF023C, LocationName.chao_race_dark_4: 0xFF023D, +} - LocationName.chao_standard_karate: 0xFF0301, +chao_karate_intermediate_location_table = { + LocationName.chao_standard_karate_1: 0xFF0305, + LocationName.chao_standard_karate_2: 0xFF0306, + LocationName.chao_standard_karate_3: 0xFF0307, + LocationName.chao_standard_karate_4: 0xFF0308, + LocationName.chao_standard_karate_5: 0xFF0309, } -chao_garden_expert_location_table = { +chao_race_expert_location_table = { LocationName.chao_race_aquamarine_1: 0xFF020C, LocationName.chao_race_aquamarine_2: 0xFF020D, LocationName.chao_race_aquamarine_3: 0xFF020E, @@ -1316,11 +1330,187 @@ class SA2BLocation(Location): LocationName.chao_race_diamond_3: 0xFF0227, LocationName.chao_race_diamond_4: 0xFF0228, LocationName.chao_race_diamond_5: 0xFF0229, +} + +chao_karate_expert_location_table = { + LocationName.chao_expert_karate_1: 0xFF030A, + LocationName.chao_expert_karate_2: 0xFF030B, + LocationName.chao_expert_karate_3: 0xFF030C, + LocationName.chao_expert_karate_4: 0xFF030D, + LocationName.chao_expert_karate_5: 0xFF030E, +} + +chao_karate_super_location_table = { + LocationName.chao_super_karate_1: 0xFF030F, + LocationName.chao_super_karate_2: 0xFF0310, + LocationName.chao_super_karate_3: 0xFF0311, + LocationName.chao_super_karate_4: 0xFF0312, + LocationName.chao_super_karate_5: 0xFF0313, +} + +chao_stat_swim_table = { LocationName.chao_stat_swim_base + str(index): (0xFF0E00 + index) for index in range(1,100) } +chao_stat_fly_table = { LocationName.chao_stat_fly_base + str(index): (0xFF0E80 + index) for index in range(1,100) } +chao_stat_run_table = { LocationName.chao_stat_run_base + str(index): (0xFF0F00 + index) for index in range(1,100) } +chao_stat_power_table = { LocationName.chao_stat_power_base + str(index): (0xFF0F80 + index) for index in range(1,100) } +chao_stat_stamina_table = { LocationName.chao_stat_stamina_base + str(index): (0xFF1000 + index) for index in range(1,100) } +chao_stat_luck_table = { LocationName.chao_stat_luck_base + str(index): (0xFF1080 + index) for index in range(1,100) } +chao_stat_intelligence_table = { LocationName.chao_stat_intelligence_base + str(index): (0xFF1100 + index) for index in range(1,100) } + +chao_animal_event_location_table = { + LocationName.animal_penguin: None, + LocationName.animal_seal: None, + LocationName.animal_otter: None, + LocationName.animal_rabbit: None, + LocationName.animal_cheetah: None, + LocationName.animal_warthog: None, + LocationName.animal_bear: None, + LocationName.animal_tiger: None, + LocationName.animal_gorilla: None, + LocationName.animal_peacock: None, + LocationName.animal_parrot: None, + LocationName.animal_condor: None, + LocationName.animal_skunk: None, + LocationName.animal_sheep: None, + LocationName.animal_raccoon: None, + LocationName.animal_halffish: None, + LocationName.animal_skeleton_dog: None, + LocationName.animal_bat: None, + LocationName.animal_dragon: None, + LocationName.animal_unicorn: None, + LocationName.animal_phoenix: None, +} + +chao_animal_part_location_table = { + LocationName.chao_penguin_arms: 0xFF1220, + LocationName.chao_penguin_forehead: 0xFF1222, + LocationName.chao_penguin_legs: 0xFF1224, + + LocationName.chao_seal_arms: 0xFF1228, + LocationName.chao_seal_tail: 0xFF122E, + + LocationName.chao_otter_arms: 0xFF1230, + LocationName.chao_otter_ears: 0xFF1231, + LocationName.chao_otter_face: 0xFF1233, + LocationName.chao_otter_legs: 0xFF1234, + LocationName.chao_otter_tail: 0xFF1236, + + LocationName.chao_rabbit_arms: 0xFF1238, + LocationName.chao_rabbit_ears: 0xFF1239, + LocationName.chao_rabbit_legs: 0xFF123C, + LocationName.chao_rabbit_tail: 0xFF123E, + + LocationName.chao_cheetah_arms: 0xFF1240, + LocationName.chao_cheetah_ears: 0xFF1241, + LocationName.chao_cheetah_legs: 0xFF1244, + LocationName.chao_cheetah_tail: 0xFF1246, + + LocationName.chao_warthog_arms: 0xFF1248, + LocationName.chao_warthog_ears: 0xFF1249, + LocationName.chao_warthog_face: 0xFF124B, + LocationName.chao_warthog_legs: 0xFF124C, + LocationName.chao_warthog_tail: 0xFF124E, + + LocationName.chao_bear_arms: 0xFF1250, + LocationName.chao_bear_ears: 0xFF1251, + LocationName.chao_bear_legs: 0xFF1254, + + LocationName.chao_tiger_arms: 0xFF1258, + LocationName.chao_tiger_ears: 0xFF1259, + LocationName.chao_tiger_legs: 0xFF125C, + LocationName.chao_tiger_tail: 0xFF125E, + + LocationName.chao_gorilla_arms: 0xFF1260, + LocationName.chao_gorilla_ears: 0xFF1261, + LocationName.chao_gorilla_forehead: 0xFF1262, + LocationName.chao_gorilla_legs: 0xFF1264, + + LocationName.chao_peacock_forehead: 0xFF126A, + LocationName.chao_peacock_legs: 0xFF126C, + LocationName.chao_peacock_tail: 0xFF126E, + LocationName.chao_peacock_wings: 0xFF126F, + + LocationName.chao_parrot_forehead: 0xFF1272, + LocationName.chao_parrot_legs: 0xFF1274, + LocationName.chao_parrot_tail: 0xFF1276, + LocationName.chao_parrot_wings: 0xFF1277, + + LocationName.chao_condor_ears: 0xFF1279, + LocationName.chao_condor_legs: 0xFF127C, + LocationName.chao_condor_tail: 0xFF127E, + LocationName.chao_condor_wings: 0xFF127F, + + LocationName.chao_skunk_arms: 0xFF1280, + LocationName.chao_skunk_forehead: 0xFF1282, + LocationName.chao_skunk_legs: 0xFF1284, + LocationName.chao_skunk_tail: 0xFF1286, + + LocationName.chao_sheep_arms: 0xFF1288, + LocationName.chao_sheep_ears: 0xFF1289, + LocationName.chao_sheep_legs: 0xFF128C, + LocationName.chao_sheep_horn: 0xFF128D, + LocationName.chao_sheep_tail: 0xFF128E, + + LocationName.chao_raccoon_arms: 0xFF1290, + LocationName.chao_raccoon_ears: 0xFF1291, + LocationName.chao_raccoon_legs: 0xFF1294, + + LocationName.chao_dragon_arms: 0xFF12A0, + LocationName.chao_dragon_ears: 0xFF12A1, + LocationName.chao_dragon_legs: 0xFF12A4, + LocationName.chao_dragon_horn: 0xFF12A5, + LocationName.chao_dragon_tail: 0xFF12A6, + LocationName.chao_dragon_wings: 0xFF12A7, + + LocationName.chao_unicorn_arms: 0xFF12A8, + LocationName.chao_unicorn_ears: 0xFF12A9, + LocationName.chao_unicorn_forehead: 0xFF12AA, + LocationName.chao_unicorn_legs: 0xFF12AC, + LocationName.chao_unicorn_tail: 0xFF12AE, + + LocationName.chao_phoenix_forehead: 0xFF12B2, + LocationName.chao_phoenix_legs: 0xFF12B4, + LocationName.chao_phoenix_tail: 0xFF12B6, + LocationName.chao_phoenix_wings: 0xFF12B7, +} + +chao_kindergarten_location_table = { + LocationName.chao_kindergarten_drawing_1: 0xFF12D0, + LocationName.chao_kindergarten_drawing_2: 0xFF12D1, + LocationName.chao_kindergarten_drawing_3: 0xFF12D2, + LocationName.chao_kindergarten_drawing_4: 0xFF12D3, + LocationName.chao_kindergarten_drawing_5: 0xFF12D4, + + LocationName.chao_kindergarten_shake_dance: 0xFF12D8, + LocationName.chao_kindergarten_spin_dance: 0xFF12D9, + LocationName.chao_kindergarten_step_dance: 0xFF12DA, + LocationName.chao_kindergarten_gogo_dance: 0xFF12DB, + LocationName.chao_kindergarten_exercise: 0xFF12DC, + + LocationName.chao_kindergarten_song_1: 0xFF12E0, + LocationName.chao_kindergarten_song_2: 0xFF12E1, + LocationName.chao_kindergarten_song_3: 0xFF12E2, + LocationName.chao_kindergarten_song_4: 0xFF12E3, + LocationName.chao_kindergarten_song_5: 0xFF12E4, + + LocationName.chao_kindergarten_bell: 0xFF12E8, + LocationName.chao_kindergarten_castanets: 0xFF12E9, + LocationName.chao_kindergarten_cymbals: 0xFF12EA, + LocationName.chao_kindergarten_drum: 0xFF12EB, + LocationName.chao_kindergarten_flute: 0xFF12EC, + LocationName.chao_kindergarten_maracas: 0xFF12ED, + LocationName.chao_kindergarten_trumpet: 0xFF12EE, + LocationName.chao_kindergarten_tambourine: 0xFF12EF, +} - LocationName.chao_expert_karate: 0xFF0302, - LocationName.chao_super_karate: 0xFF0303, +chao_kindergarten_basics_location_table = { + LocationName.chao_kindergarten_any_drawing: 0xFF12F0, + LocationName.chao_kindergarten_any_dance: 0xFF12F1, + LocationName.chao_kindergarten_any_song: 0xFF12F2, + LocationName.chao_kindergarten_any_instrument: 0xFF12F3, } +black_market_location_table = { LocationName.chao_black_market_base + str(index): (0xFF1300 + index) for index in range(1,65) } + kart_race_beginner_location_table = { LocationName.kart_race_beginner_sonic: 0xFF0A00, LocationName.kart_race_beginner_tails: 0xFF0A01, @@ -1375,6 +1565,10 @@ class SA2BLocation(Location): LocationName.grand_prix: 0xFF007F, } +chaos_chao_location_table = { + LocationName.chaos_chao: 0xFF009F, +} + all_locations = { **mission_location_table, **upgrade_location_table, @@ -1386,9 +1580,13 @@ class SA2BLocation(Location): **beetle_location_table, **omochao_location_table, **animal_location_table, - **chao_garden_beginner_location_table, - **chao_garden_intermediate_location_table, - **chao_garden_expert_location_table, + **chao_race_beginner_location_table, + **chao_karate_beginner_location_table, + **chao_race_intermediate_location_table, + **chao_karate_intermediate_location_table, + **chao_race_expert_location_table, + **chao_karate_expert_location_table, + **chao_karate_super_location_table, **kart_race_beginner_location_table, **kart_race_standard_location_table, **kart_race_expert_location_table, @@ -1398,6 +1596,18 @@ class SA2BLocation(Location): **green_hill_animal_location_table, **final_boss_location_table, **grand_prix_location_table, + **chaos_chao_location_table, + **chao_stat_swim_table, + **chao_stat_fly_table, + **chao_stat_run_table, + **chao_stat_power_table, + **chao_stat_stamina_table, + **chao_stat_luck_table, + **chao_stat_intelligence_table, + **chao_animal_part_location_table, + **chao_kindergarten_location_table, + **chao_kindergarten_basics_location_table, + **black_market_location_table, } boss_gate_set = [ @@ -1408,13 +1618,6 @@ class SA2BLocation(Location): LocationName.gate_5_boss, ] -chao_karate_set = [ - LocationName.chao_beginner_karate, - LocationName.chao_standard_karate, - LocationName.chao_expert_karate, - LocationName.chao_super_karate, -] - chao_race_prize_set = [ LocationName.chao_race_crab_pool_3, LocationName.chao_race_stump_valley_3, @@ -1437,19 +1640,24 @@ class SA2BLocation(Location): LocationName.chao_race_dark_2, LocationName.chao_race_dark_4, + + LocationName.chao_beginner_karate_5, + LocationName.chao_standard_karate_5, + LocationName.chao_expert_karate_5, + LocationName.chao_super_karate_5, ] -def setup_locations(world: MultiWorld, player: int, mission_map: typing.Dict[int, int], mission_count_map: typing.Dict[int, int]): +def setup_locations(world: World, player: int, mission_map: typing.Dict[int, int], mission_count_map: typing.Dict[int, int]): location_table = {} chao_location_table = {} - if world.goal[player] == 3: - if world.kart_race_checks[player] == 2: + if world.options.goal == 3: + if world.options.kart_race_checks == 2: location_table.update({**kart_race_beginner_location_table}) location_table.update({**kart_race_standard_location_table}) location_table.update({**kart_race_expert_location_table}) - elif world.kart_race_checks[player] == 1: + elif world.options.kart_race_checks == 1: location_table.update({**kart_race_mini_location_table}) location_table.update({**grand_prix_location_table}) else: @@ -1465,67 +1673,100 @@ def setup_locations(world: MultiWorld, player: int, mission_map: typing.Dict[int location_table.update({**upgrade_location_table}) - if world.keysanity[player]: + if world.options.keysanity: location_table.update({**chao_key_location_table}) - if world.whistlesanity[player].value == 1: + if world.options.whistlesanity.value == 1: location_table.update({**pipe_location_table}) - elif world.whistlesanity[player].value == 2: + elif world.options.whistlesanity.value == 2: location_table.update({**hidden_whistle_location_table}) - elif world.whistlesanity[player].value == 3: + elif world.options.whistlesanity.value == 3: location_table.update({**pipe_location_table}) location_table.update({**hidden_whistle_location_table}) - if world.beetlesanity[player]: + if world.options.beetlesanity: location_table.update({**beetle_location_table}) - if world.omosanity[player]: + if world.options.omosanity: location_table.update({**omochao_location_table}) - if world.animalsanity[player]: + if world.options.animalsanity: location_table.update({**animal_location_table}) - if world.kart_race_checks[player] == 2: + if world.options.kart_race_checks == 2: location_table.update({**kart_race_beginner_location_table}) location_table.update({**kart_race_standard_location_table}) location_table.update({**kart_race_expert_location_table}) - elif world.kart_race_checks[player] == 1: + elif world.options.kart_race_checks == 1: location_table.update({**kart_race_mini_location_table}) - if world.goal[player].value in [0, 2, 4, 5, 6]: + if world.options.goal.value in [0, 2, 4, 5, 6]: location_table.update({**final_boss_location_table}) + elif world.options.goal.value in [7]: + location_table.update({**chaos_chao_location_table}) - if world.goal[player].value in [1, 2]: + if world.options.goal.value in [1, 2]: location_table.update({**green_hill_location_table}) - if world.keysanity[player]: + if world.options.keysanity: location_table.update({**green_hill_chao_location_table}) - if world.animalsanity[player]: + if world.options.animalsanity: location_table.update({**green_hill_animal_location_table}) - if world.goal[player].value in [4, 5, 6]: + if world.options.goal.value in [4, 5, 6]: location_table.update({**boss_rush_location_table}) - if world.chao_garden_difficulty[player].value >= 1: - chao_location_table.update({**chao_garden_beginner_location_table}) - if world.chao_garden_difficulty[player].value >= 2: - chao_location_table.update({**chao_garden_intermediate_location_table}) - if world.chao_garden_difficulty[player].value >= 3: - chao_location_table.update({**chao_garden_expert_location_table}) + if world.options.chao_race_difficulty.value >= 1: + chao_location_table.update({**chao_race_beginner_location_table}) + if world.options.chao_race_difficulty.value >= 2: + chao_location_table.update({**chao_race_intermediate_location_table}) + if world.options.chao_race_difficulty.value >= 3: + chao_location_table.update({**chao_race_expert_location_table}) + + if world.options.chao_karate_difficulty.value >= 1: + chao_location_table.update({**chao_karate_beginner_location_table}) + if world.options.chao_karate_difficulty.value >= 2: + chao_location_table.update({**chao_karate_intermediate_location_table}) + if world.options.chao_karate_difficulty.value >= 3: + chao_location_table.update({**chao_karate_expert_location_table}) + if world.options.chao_karate_difficulty.value >= 4: + chao_location_table.update({**chao_karate_super_location_table}) for key, value in chao_location_table.items(): - if key in chao_karate_set: - if world.include_chao_karate[player]: - location_table[key] = value - elif key not in chao_race_prize_set: - if world.chao_race_checks[player] == "all": + if key not in chao_race_prize_set: + if world.options.chao_stadium_checks == "all": location_table[key] = value else: location_table[key] = value + for index in range(1, world.options.chao_stats.value + 1): + if (index % world.options.chao_stats_frequency.value) == (world.options.chao_stats.value % world.options.chao_stats_frequency.value): + location_table[LocationName.chao_stat_swim_base + str(index)] = chao_stat_swim_table[ LocationName.chao_stat_swim_base + str(index)] + location_table[LocationName.chao_stat_fly_base + str(index)] = chao_stat_fly_table[ LocationName.chao_stat_fly_base + str(index)] + location_table[LocationName.chao_stat_run_base + str(index)] = chao_stat_run_table[ LocationName.chao_stat_run_base + str(index)] + location_table[LocationName.chao_stat_power_base + str(index)] = chao_stat_power_table[ LocationName.chao_stat_power_base + str(index)] + + if world.options.chao_stats_stamina: + location_table[LocationName.chao_stat_stamina_base + str(index)] = chao_stat_stamina_table[LocationName.chao_stat_stamina_base + str(index)] + + if world.options.chao_stats_hidden: + location_table[LocationName.chao_stat_luck_base + str(index)] = chao_stat_luck_table[ LocationName.chao_stat_luck_base + str(index)] + location_table[LocationName.chao_stat_intelligence_base + str(index)] = chao_stat_intelligence_table[LocationName.chao_stat_intelligence_base + str(index)] + + if world.options.chao_animal_parts: + location_table.update({**chao_animal_part_location_table}) + + if world.options.chao_kindergarten.value == 1: + location_table.update({**chao_kindergarten_basics_location_table}) + elif world.options.chao_kindergarten.value == 2: + location_table.update({**chao_kindergarten_location_table}) + + for index in range(1, world.options.black_market_slots.value + 1): + location_table[LocationName.chao_black_market_base + str(index)] = black_market_location_table[LocationName.chao_black_market_base + str(index)] + for x in range(len(boss_gate_set)): - if x < world.number_of_level_gates[player].value: + if x < world.options.number_of_level_gates.value: location_table[boss_gate_set[x]] = boss_gate_location_table[boss_gate_set[x]] return location_table diff --git a/worlds/sa2b/Missions.py b/worlds/sa2b/Missions.py index 1fcd2aed87c4..5ee48d564015 100644 --- a/worlds/sa2b/Missions.py +++ b/worlds/sa2b/Missions.py @@ -2,6 +2,7 @@ import copy from BaseClasses import MultiWorld +from worlds.AutoWorld import World mission_orders: typing.List[typing.List[int]] = [ @@ -193,10 +194,10 @@ "Cannon's Core - ", ] -def get_mission_count_table(multiworld: MultiWorld, player: int): +def get_mission_count_table(multiworld: MultiWorld, world: World, player: int): mission_count_table: typing.Dict[int, int] = {} - if multiworld.goal[player] == 3: + if world.options.goal == 3: for level in range(31): mission_count_table[level] = 0 else: @@ -207,26 +208,26 @@ def get_mission_count_table(multiworld: MultiWorld, player: int): cannons_core_active_missions = 1 for i in range(2,6): - if getattr(multiworld, "speed_mission_" + str(i), None)[player]: + if getattr(world.options, "speed_mission_" + str(i), None): speed_active_missions += 1 - if getattr(multiworld, "mech_mission_" + str(i), None)[player]: + if getattr(world.options, "mech_mission_" + str(i), None): mech_active_missions += 1 - if getattr(multiworld, "hunt_mission_" + str(i), None)[player]: + if getattr(world.options, "hunt_mission_" + str(i), None): hunt_active_missions += 1 - if getattr(multiworld, "kart_mission_" + str(i), None)[player]: + if getattr(world.options, "kart_mission_" + str(i), None): kart_active_missions += 1 - if getattr(multiworld, "cannons_core_mission_" + str(i), None)[player]: + if getattr(world.options, "cannons_core_mission_" + str(i), None): cannons_core_active_missions += 1 - speed_active_missions = min(speed_active_missions, multiworld.speed_mission_count[player].value) - mech_active_missions = min(mech_active_missions, multiworld.mech_mission_count[player].value) - hunt_active_missions = min(hunt_active_missions, multiworld.hunt_mission_count[player].value) - kart_active_missions = min(kart_active_missions, multiworld.kart_mission_count[player].value) - cannons_core_active_missions = min(cannons_core_active_missions, multiworld.cannons_core_mission_count[player].value) + speed_active_missions = min(speed_active_missions, world.options.speed_mission_count.value) + mech_active_missions = min(mech_active_missions, world.options.mech_mission_count.value) + hunt_active_missions = min(hunt_active_missions, world.options.hunt_mission_count.value) + kart_active_missions = min(kart_active_missions, world.options.kart_mission_count.value) + cannons_core_active_missions = min(cannons_core_active_missions, world.options.cannons_core_mission_count.value) active_missions: typing.List[typing.List[int]] = [ speed_active_missions, @@ -244,10 +245,10 @@ def get_mission_count_table(multiworld: MultiWorld, player: int): return mission_count_table -def get_mission_table(multiworld: MultiWorld, player: int): +def get_mission_table(multiworld: MultiWorld, world: World, player: int): mission_table: typing.Dict[int, int] = {} - if multiworld.goal[player] == 3: + if world.options.goal == 3: for level in range(31): mission_table[level] = 0 else: @@ -259,19 +260,19 @@ def get_mission_table(multiworld: MultiWorld, player: int): # Add included missions for i in range(2,6): - if getattr(multiworld, "speed_mission_" + str(i), None)[player]: + if getattr(world.options, "speed_mission_" + str(i), None): speed_active_missions.append(i) - if getattr(multiworld, "mech_mission_" + str(i), None)[player]: + if getattr(world.options, "mech_mission_" + str(i), None): mech_active_missions.append(i) - if getattr(multiworld, "hunt_mission_" + str(i), None)[player]: + if getattr(world.options, "hunt_mission_" + str(i), None): hunt_active_missions.append(i) - if getattr(multiworld, "kart_mission_" + str(i), None)[player]: + if getattr(world.options, "kart_mission_" + str(i), None): kart_active_missions.append(i) - if getattr(multiworld, "cannons_core_mission_" + str(i), None)[player]: + if getattr(world.options, "cannons_core_mission_" + str(i), None): cannons_core_active_missions.append(i) active_missions: typing.List[typing.List[int]] = [ @@ -292,10 +293,10 @@ def get_mission_table(multiworld: MultiWorld, player: int): first_mission = 1 first_mission_options = [1, 2, 3] - if not multiworld.animalsanity[player]: + if not world.options.animalsanity: first_mission_options.append(4) - if multiworld.mission_shuffle[player]: + if world.options.mission_shuffle: first_mission = multiworld.random.choice([mission for mission in level_active_missions if mission in first_mission_options]) level_active_missions.remove(first_mission) @@ -305,7 +306,7 @@ def get_mission_table(multiworld: MultiWorld, player: int): if mission not in level_chosen_missions: level_chosen_missions.append(mission) - if multiworld.mission_shuffle[player]: + if world.options.mission_shuffle: multiworld.random.shuffle(level_chosen_missions) level_chosen_missions.insert(0, first_mission) diff --git a/worlds/sa2b/Names/ItemName.py b/worlds/sa2b/Names/ItemName.py index eb088ceb4057..c6de98183b9d 100644 --- a/worlds/sa2b/Names/ItemName.py +++ b/worlds/sa2b/Names/ItemName.py @@ -1,6 +1,9 @@ # Emblem Definition emblem = "Emblem" +# Market Token Definition +market_token = "Chao Coin" + # Upgrade Definitions sonic_gloves = "Sonic - Magic Glove" sonic_light_shoes = "Sonic - Light Shoes" @@ -36,6 +39,8 @@ rouge_treasure_scope = "Rouge - Treasure Scope" rouge_iron_boots = "Rouge - Iron Boots" + +# Junk five_rings = "Five Rings" ten_rings = "Ten Rings" twenty_rings = "Twenty Rings" @@ -44,6 +49,8 @@ magnetic_shield = "Magnetic Shield" invincibility = "Invincibility" + +# Traps omochao_trap = "OmoTrap" timestop_trap = "Chaos Control Trap" confuse_trap = "Confusion Trap" @@ -54,9 +61,12 @@ ice_trap = "Ice Trap" slow_trap = "Slow Trap" cutscene_trap = "Cutscene Trap" +reverse_trap = "Reverse Trap" pong_trap = "Pong Trap" + +# Chaos Emeralds white_emerald = "White Chaos Emerald" red_emerald = "Red Chaos Emerald" cyan_emerald = "Cyan Chaos Emerald" @@ -65,4 +75,140 @@ yellow_emerald = "Yellow Chaos Emerald" blue_emerald = "Blue Chaos Emerald" + +# Chao Eggs +normal_egg = "Normal Egg" +yellow_monotone_egg = "Yellow Mono-Tone Egg" +white_monotone_egg = "White Mono-Tone Egg" +brown_monotone_egg = "Brown Mono-Tone Egg" +sky_blue_monotone_egg = "Sky Blue Mono-Tone Egg" +pink_monotone_egg = "Pink Mono-Tone Egg" +blue_monotone_egg = "Blue Mono-Tone Egg" +grey_monotone_egg = "Grey Mono-Tone Egg" +green_monotone_egg = "Green Mono-Tone Egg" +red_monotone_egg = "Red Mono-Tone Egg" +lime_green_monotone_egg = "Lime Green Mono-Tone Egg" +purple_monotone_egg = "Purple Mono-Tone Egg" +orange_monotone_egg = "Orange Mono-Tone Egg" +black_monotone_egg = "Black Mono-Tone Egg" + +yellow_twotone_egg = "Yellow Two-Tone Egg" +white_twotone_egg = "White Two-Tone Egg" +brown_twotone_egg = "Brown Two-Tone Egg" +sky_blue_twotone_egg = "Sky Blue Two-Tone Egg" +pink_twotone_egg = "Pink Two-Tone Egg" +blue_twotone_egg = "Blue Two-Tone Egg" +grey_twotone_egg = "Grey Two-Tone Egg" +green_twotone_egg = "Green Two-Tone Egg" +red_twotone_egg = "Red Two-Tone Egg" +lime_green_twotone_egg = "Lime Green Two-Tone Egg" +purple_twotone_egg = "Purple Two-Tone Egg" +orange_twotone_egg = "Orange Two-Tone Egg" +black_twotone_egg = "Black Two-Tone Egg" + +normal_shiny_egg = "Normal Shiny Egg" +yellow_shiny_egg = "Yellow Shiny Egg" +white_shiny_egg = "White Shiny Egg" +brown_shiny_egg = "Brown Shiny Egg" +sky_blue_shiny_egg = "Sky Blue Shiny Egg" +pink_shiny_egg = "Pink Shiny Egg" +blue_shiny_egg = "Blue Shiny Egg" +grey_shiny_egg = "Grey Shiny Egg" +green_shiny_egg = "Green Shiny Egg" +red_shiny_egg = "Red Shiny Egg" +lime_green_shiny_egg = "Lime Green Shiny Egg" +purple_shiny_egg = "Purple Shiny Egg" +orange_shiny_egg = "Orange Shiny Egg" +black_shiny_egg = "Black Shiny Egg" + + +# Chao Fruit +chao_garden_fruit = "Chao Garden Fruit" +hero_garden_fruit = "Hero Garden Fruit" +dark_garden_fruit = "Dark Garden Fruit" + +strong_fruit = "Strong Fruit" +tasty_fruit = "Tasty Fruit" +hero_fruit = "Hero Fruit" +dark_fruit = "Dark Fruit" +round_fruit = "Round Fruit" +triangle_fruit = "Triangle Fruit" +square_fruit = "Square Fruit" +heart_fruit = "Heart Fruit" +chao_fruit = "Chao Fruit" +smart_fruit = "Smart Fruit" + +orange_fruit = "Orange Fruit" +blue_fruit = "Blue Fruit" +pink_fruit = "Pink Fruit" +green_fruit = "Green Fruit" +purple_fruit = "Purple Fruit" +yellow_fruit = "Yellow Fruit" +red_fruit = "Red Fruit" + +mushroom_fruit = "Mushroom" +super_mushroom_fruit = "Super Mushroom" +mint_candy_fruit = "Mint Candy" +grapes_fruit = "Grapes" + + +# Chao Seeds +strong_seed = "Strong Seed" +tasty_seed = "Tasty Seed" +hero_seed = "Hero Seed" +dark_seed = "Dark Seed" +round_seed = "Round Seed" +triangle_seed = "Triangle Seed" +square_seed = "Square Seed" + + +# Chao Hats +pumpkin_hat = "Pumpkin" +skull_hat = "Skull" +apple_hat = "Apple" +bucket_hat = "Bucket" +empty_can_hat = "Empty Can" +cardboard_box_hat = "Cardboard Box" +flower_pot_hat = "Flower Pot" +paper_bag_hat = "Paper Bag" +pan_hat = "Pan" +stump_hat = "Stump" +watermelon_hat = "Watermelon" + +red_wool_beanie_hat = "Red Wool Beanie" +blue_wool_beanie_hat = "Blue Wool Beanie" +black_wool_beanie_hat = "Black Wool Beanie" +pacifier_hat = "Pacifier" + + +# Animal Items +animal_penguin = "Penguin" +animal_seal = "Seal" +animal_otter = "Otter" +animal_rabbit = "Rabbit" +animal_cheetah = "Cheetah" +animal_warthog = "Warthog" +animal_bear = "Bear" +animal_tiger = "Tiger" +animal_gorilla = "Gorilla" +animal_peacock = "Peacock" +animal_parrot = "Parrot" +animal_condor = "Condor" +animal_skunk = "Skunk" +animal_sheep = "Sheep" +animal_raccoon = "Raccoon" +animal_halffish = "HalfFish" +animal_skeleton_dog = "Skeleton Dog" +animal_bat = "Bat" +animal_dragon = "Dragon" +animal_unicorn = "Unicorn" +animal_phoenix = "Phoenix" + +chaos_drive_yellow = "Yellow Chaos Drive" +chaos_drive_green = "Green Chaos Drive" +chaos_drive_red = "Red Chaos Drive" +chaos_drive_purple = "Purple Chaos Drive" + + +# Goal Item maria = "What Maria Wanted" diff --git a/worlds/sa2b/Names/LocationName.py b/worlds/sa2b/Names/LocationName.py index f0638430fc50..bde25a8a7597 100644 --- a/worlds/sa2b/Names/LocationName.py +++ b/worlds/sa2b/Names/LocationName.py @@ -909,6 +909,7 @@ dry_lagoon_animal_8 = "Dry Lagoon - 8 Animals" dry_lagoon_animal_9 = "Dry Lagoon - 9 Animals" dry_lagoon_animal_10 = "Dry Lagoon - 10 Animals" +dry_lagoon_animal_11 = "Dry Lagoon - 11 Animals" dry_lagoon_upgrade = "Dry Lagoon - Upgrade" egg_quarters_1 = "Egg Quarters - 1" egg_quarters_2 = "Egg Quarters - 2" @@ -1150,10 +1151,190 @@ chao_race_dark_3 = "Chao Race - Dark 3" chao_race_dark_4 = "Chao Race - Dark 4" -chao_beginner_karate = "Chao Karate - Beginner" -chao_standard_karate = "Chao Karate - Standard" -chao_expert_karate = "Chao Karate - Expert" -chao_super_karate = "Chao Karate - Super" +chao_beginner_karate_1 = "Chao Karate - Beginner 1" +chao_beginner_karate_2 = "Chao Karate - Beginner 2" +chao_beginner_karate_3 = "Chao Karate - Beginner 3" +chao_beginner_karate_4 = "Chao Karate - Beginner 4" +chao_beginner_karate_5 = "Chao Karate - Beginner 5" +chao_standard_karate_1 = "Chao Karate - Standard 1" +chao_standard_karate_2 = "Chao Karate - Standard 2" +chao_standard_karate_3 = "Chao Karate - Standard 3" +chao_standard_karate_4 = "Chao Karate - Standard 4" +chao_standard_karate_5 = "Chao Karate - Standard 5" +chao_expert_karate_1 = "Chao Karate - Expert 1" +chao_expert_karate_2 = "Chao Karate - Expert 2" +chao_expert_karate_3 = "Chao Karate - Expert 3" +chao_expert_karate_4 = "Chao Karate - Expert 4" +chao_expert_karate_5 = "Chao Karate - Expert 5" +chao_super_karate_1 = "Chao Karate - Super 1" +chao_super_karate_2 = "Chao Karate - Super 2" +chao_super_karate_3 = "Chao Karate - Super 3" +chao_super_karate_4 = "Chao Karate - Super 4" +chao_super_karate_5 = "Chao Karate - Super 5" + +chao_stat_swim_base = "Chao Stat - Swim - " +chao_stat_fly_base = "Chao Stat - Fly - " +chao_stat_run_base = "Chao Stat - Run - " +chao_stat_power_base = "Chao Stat - Power - " +chao_stat_stamina_base = "Chao Stat - Stamina - " +chao_stat_luck_base = "Chao Stat - Luck - " +chao_stat_intelligence_base = "Chao Stat - Intelligence - " + +chao_black_market_base = "Black Market - " + +# Animal Event Locations +animal_penguin = "Penguin Behavior" +animal_seal = "Seal Behavior" +animal_otter = "Otter Behavior" +animal_rabbit = "Rabbit Behavior" +animal_cheetah = "Cheetah Behavior" +animal_warthog = "Warthog Behavior" +animal_bear = "Bear Behavior" +animal_tiger = "Tiger Behavior" +animal_gorilla = "Gorilla Behavior" +animal_peacock = "Peacock Behavior" +animal_parrot = "Parrot Behavior" +animal_condor = "Condor Behavior" +animal_skunk = "Skunk Behavior" +animal_sheep = "Sheep Behavior" +animal_raccoon = "Raccoon Behavior" +animal_halffish = "HalfFish Behavior" +animal_skeleton_dog = "Skeleton Dog Behavior" +animal_bat = "Bat Behavior" +animal_dragon = "Dragon Behavior" +animal_unicorn = "Unicorn Behavior" +animal_phoenix = "Phoenix Behavior" + +# Animal Body Part Locations +chao_penguin_arms = "Chao - Penguin Arms" +chao_penguin_forehead = "Chao - Penguin Forehead" +chao_penguin_legs = "Chao - Penguin Legs" + +chao_seal_arms = "Chao - Seal Arms" +chao_seal_tail = "Chao - Seal Tail" + +chao_otter_arms = "Chao - Otter Arms" +chao_otter_ears = "Chao - Otter Ears" +chao_otter_face = "Chao - Otter Face" +chao_otter_legs = "Chao - Otter Legs" +chao_otter_tail = "Chao - Otter Tail" + +chao_rabbit_arms = "Chao - Rabbit Arms" +chao_rabbit_ears = "Chao - Rabbit Ears" +chao_rabbit_legs = "Chao - Rabbit Legs" +chao_rabbit_tail = "Chao - Rabbit Tail" + +chao_cheetah_arms = "Chao - Cheetah Arms" +chao_cheetah_ears = "Chao - Cheetah Ears" +chao_cheetah_legs = "Chao - Cheetah Legs" +chao_cheetah_tail = "Chao - Cheetah Tail" + +chao_warthog_arms = "Chao - Warthog Arms" +chao_warthog_ears = "Chao - Warthog Ears" +chao_warthog_face = "Chao - Warthog Face" +chao_warthog_legs = "Chao - Warthog Legs" +chao_warthog_tail = "Chao - Warthog Tail" + +chao_bear_arms = "Chao - Bear Arms" +chao_bear_ears = "Chao - Bear Ears" +chao_bear_legs = "Chao - Bear Legs" + +chao_tiger_arms = "Chao - Tiger Arms" +chao_tiger_ears = "Chao - Tiger Ears" +chao_tiger_legs = "Chao - Tiger Legs" +chao_tiger_tail = "Chao - Tiger Tail" + +chao_gorilla_arms = "Chao - Gorilla Arms" +chao_gorilla_ears = "Chao - Gorilla Ears" +chao_gorilla_forehead = "Chao - Gorilla Forehead" +chao_gorilla_legs = "Chao - Gorilla Legs" + +chao_peacock_forehead = "Chao - Peacock Forehead" +chao_peacock_legs = "Chao - Peacock Legs" +chao_peacock_tail = "Chao - Peacock Tail" +chao_peacock_wings = "Chao - Peacock Wings" + +chao_parrot_forehead = "Chao - Parrot Forehead" +chao_parrot_legs = "Chao - Parrot Legs" +chao_parrot_tail = "Chao - Parrot Tail" +chao_parrot_wings = "Chao - Parrot Wings" + +chao_condor_ears = "Chao - Condor Ears" +chao_condor_legs = "Chao - Condor Legs" +chao_condor_tail = "Chao - Condor Tail" +chao_condor_wings = "Chao - Condor Wings" + +chao_skunk_arms = "Chao - Skunk Arms" +chao_skunk_forehead = "Chao - Skunk Forehead" +chao_skunk_legs = "Chao - Skunk Legs" +chao_skunk_tail = "Chao - Skunk Tail" + +chao_sheep_arms = "Chao - Sheep Arms" +chao_sheep_ears = "Chao - Sheep Ears" +chao_sheep_legs = "Chao - Sheep Legs" +chao_sheep_horn = "Chao - Sheep Horn" +chao_sheep_tail = "Chao - Sheep Tail" + +chao_raccoon_arms = "Chao - Raccoon Arms" +chao_raccoon_ears = "Chao - Raccoon Ears" +chao_raccoon_legs = "Chao - Raccoon Legs" + +chao_dragon_arms = "Chao - Dragon Arms" +chao_dragon_ears = "Chao - Dragon Ears" +chao_dragon_legs = "Chao - Dragon Legs" +chao_dragon_horn = "Chao - Dragon Horn" +chao_dragon_tail = "Chao - Dragon Tail" +chao_dragon_wings = "Chao - Dragon Wings" + +chao_unicorn_arms = "Chao - Unicorn Arms" +chao_unicorn_ears = "Chao - Unicorn Ears" +chao_unicorn_forehead = "Chao - Unicorn Forehead" +chao_unicorn_legs = "Chao - Unicorn Legs" +chao_unicorn_tail = "Chao - Unicorn Tail" + +chao_phoenix_forehead = "Chao - Phoenix Forehead" +chao_phoenix_legs = "Chao - Phoenix Legs" +chao_phoenix_tail = "Chao - Phoenix Tail" +chao_phoenix_wings = "Chao - Phoenix Wings" + +# Chao Kindergarten Locations +chao_kindergarten_drawing_1 = "Chao Kindergarten - Drawing 1" +chao_kindergarten_drawing_2 = "Chao Kindergarten - Drawing 2" +chao_kindergarten_drawing_3 = "Chao Kindergarten - Drawing 3" +chao_kindergarten_drawing_4 = "Chao Kindergarten - Drawing 4" +chao_kindergarten_drawing_5 = "Chao Kindergarten - Drawing 5" + +chao_kindergarten_shake_dance = "Chao Kindergarten - Shake Dance" +chao_kindergarten_spin_dance = "Chao Kindergarten - Spin Dance" +chao_kindergarten_step_dance = "Chao Kindergarten - Step Dance" +chao_kindergarten_gogo_dance = "Chao Kindergarten - Go-Go Dance" +chao_kindergarten_exercise = "Chao Kindergarten - Exercise" + +chao_kindergarten_song_1 = "Chao Kindergarten - Song 1" +chao_kindergarten_song_2 = "Chao Kindergarten - Song 2" +chao_kindergarten_song_3 = "Chao Kindergarten - Song 3" +chao_kindergarten_song_4 = "Chao Kindergarten - Song 4" +chao_kindergarten_song_5 = "Chao Kindergarten - Song 5" + +chao_kindergarten_bell = "Chao Kindergarten - Bell" +chao_kindergarten_castanets = "Chao Kindergarten - Castanets" +chao_kindergarten_cymbals = "Chao Kindergarten - Cymbals" +chao_kindergarten_drum = "Chao Kindergarten - Drum" +chao_kindergarten_flute = "Chao Kindergarten - Flute" +chao_kindergarten_maracas = "Chao Kindergarten - Maracas" +chao_kindergarten_trumpet = "Chao Kindergarten - Trumpet" +chao_kindergarten_tambourine = "Chao Kindergarten - Tambourine" + +chao_kindergarten_any_drawing = "Chao Kindergarten - Any Drawing" +chao_kindergarten_any_dance = "Chao Kindergarten - Any Dance" +chao_kindergarten_any_song = "Chao Kindergarten - Any Song" +chao_kindergarten_any_instrument = "Chao Kindergarten - Any Instrument" + + +# Chao Goal Locations +chaos_chao = "Chaos Chao" +chaos_chao_region = "Chaos Chao" + # Kart Race Definitions kart_race_beginner_sonic = "Kart Race - Beginner - Sonic" @@ -1261,9 +1442,18 @@ grand_prix = "Grand Prix" grand_prix_region = "Grand Prix" -chao_garden_beginner_region = "Chao Garden - Beginner" -chao_garden_intermediate_region = "Chao Garden - Intermediate" -chao_garden_expert_region = "Chao Garden - Expert" +chao_race_beginner_region = "Chao Race - Beginner" +chao_race_intermediate_region = "Chao Race - Intermediate" +chao_race_expert_region = "Chao Race - Expert" + +chao_karate_beginner_region = "Chao Karate - Beginner" +chao_karate_intermediate_region = "Chao Karate - Standard" +chao_karate_expert_region = "Chao Karate - Expert" +chao_karate_super_region = "Chao Karate - Super" + +chao_kindergarten_region = "Chao Kindergarten" + +black_market_region = "Black Market" kart_race_beginner_region = "Kart Race - Beginner" kart_race_standard_region = "Kart Race - Intermediate" diff --git a/worlds/sa2b/Options.py b/worlds/sa2b/Options.py index 6bef9def3dd8..be001572849c 100644 --- a/worlds/sa2b/Options.py +++ b/worlds/sa2b/Options.py @@ -13,6 +13,7 @@ class Goal(Choice): Boss Rush: Beat all of the bosses in the Boss Rush, ending with Finalhazard Cannon's Core Boss Rush: Beat Cannon's Core, then beat all of the bosses in the Boss Rush, ending with Finalhazard Boss Rush Chaos Emerald Hunt: Find the Seven Chaos Emeralds, then beat all of the bosses in the Boss Rush, ending with Finalhazard + Chaos Chao: Raise a Chaos Chao to win """ display_name = "Goal" option_biolizard = 0 @@ -22,6 +23,7 @@ class Goal(Choice): option_boss_rush = 4 option_cannons_core_boss_rush = 5 option_boss_rush_chaos_emerald_hunt = 6 + option_chaos_chao = 7 default = 0 @classmethod @@ -70,74 +72,81 @@ class BaseTrapWeight(Choice): class OmochaoTrapWeight(BaseTrapWeight): """ - Likelihood of a receiving a trap which spawns several Omochao around the player + Likelihood of receiving a trap which spawns several Omochao around the player """ display_name = "OmoTrap Weight" class TimestopTrapWeight(BaseTrapWeight): """ - Likelihood of a receiving a trap which briefly stops time + Likelihood of receiving a trap which briefly stops time """ display_name = "Chaos Control Trap Weight" class ConfusionTrapWeight(BaseTrapWeight): """ - Likelihood of a receiving a trap which causes the controls to be skewed for a period of time + Likelihood of receiving a trap which causes the controls to be skewed for a period of time """ display_name = "Confusion Trap Weight" class TinyTrapWeight(BaseTrapWeight): """ - Likelihood of a receiving a trap which causes the player to become tiny + Likelihood of receiving a trap which causes the player to become tiny """ display_name = "Tiny Trap Weight" class GravityTrapWeight(BaseTrapWeight): """ - Likelihood of a receiving a trap which increases gravity + Likelihood of receiving a trap which increases gravity """ display_name = "Gravity Trap Weight" class ExpositionTrapWeight(BaseTrapWeight): """ - Likelihood of a receiving a trap which tells you the story + Likelihood of receiving a trap which tells you the story """ display_name = "Exposition Trap Weight" class DarknessTrapWeight(BaseTrapWeight): """ - Likelihood of a receiving a trap which makes the world dark + Likelihood of receiving a trap which makes the world dark """ display_name = "Darkness Trap Weight" class IceTrapWeight(BaseTrapWeight): """ - Likelihood of a receiving a trap which makes the world slippery + Likelihood of receiving a trap which makes the world slippery """ display_name = "Ice Trap Weight" class SlowTrapWeight(BaseTrapWeight): """ - Likelihood of a receiving a trap which makes you gotta go slow + Likelihood of receiving a trap which makes you gotta go slow """ display_name = "Slow Trap Weight" class CutsceneTrapWeight(BaseTrapWeight): """ - Likelihood of a receiving a trap which makes you watch an unskippable cutscene + Likelihood of receiving a trap which makes you watch an unskippable cutscene """ display_name = "Cutscene Trap Weight" +class ReverseTrapWeight(BaseTrapWeight): + """ + Likelihood of receiving a trap which reverses your controls + """ + display_name = "Reverse Trap Weight" + + class PongTrapWeight(BaseTrapWeight): """ Likelihood of receiving a trap which forces you to play a Pong minigame @@ -219,7 +228,7 @@ class Omosanity(Toggle): class Animalsanity(Toggle): """ Determines whether picking up counted small animals grants checks - (420 Locations) + (421 Locations) """ display_name = "Animalsanity" @@ -291,7 +300,7 @@ class MaximumEmblemCap(Range): """ display_name = "Max Emblem Cap" range_start = 50 - range_end = 500 + range_end = 1000 default = 180 @@ -308,15 +317,15 @@ class RequiredRank(Choice): default = 0 -class ChaoGardenDifficulty(Choice): +class ChaoRaceDifficulty(Choice): """ - Determines the number of chao garden difficulty levels included. Easier difficulty settings means fewer chao garden checks - None: No Chao Garden Activities have checks + Determines the number of Chao Race difficulty levels included. Easier difficulty settings means fewer Chao Race checks + None: No Chao Races have checks Beginner: Beginner Races Intermediate: Beginner, Challenge, Hero, and Dark Races Expert: Beginner, Challenge, Hero, Dark and Jewel Races """ - display_name = "Chao Garden Difficulty" + display_name = "Chao Race Difficulty" option_none = 0 option_beginner = 1 option_intermediate = 2 @@ -324,26 +333,138 @@ class ChaoGardenDifficulty(Choice): default = 0 -class IncludeChaoKarate(Toggle): +class ChaoKarateDifficulty(Choice): """ - Determines whether the Chao Karate should be included as checks (Note: This setting requires purchase of the "Battle" DLC) + Determines the number of Chao Karate difficulty levels included. (Note: This setting requires purchase of the "Battle" DLC) """ - display_name = "Include Chao Karate" + display_name = "Chao Karate Difficulty" + option_none = 0 + option_beginner = 1 + option_standard = 2 + option_expert = 3 + option_super = 4 + default = 0 -class ChaoRaceChecks(Choice): +class ChaoStadiumChecks(Choice): """ - Determines which Chao Races grant checks - All: Each individual race grants a check + Determines which Chao Stadium activities grant checks + All: Each individual race and karate fight grants a check Prize: Only the races which grant Chao Toys grant checks (final race of each Beginner and Jewel cup, 4th, 8th, and - 12th Challenge Races, 2nd and 4th Hero and Dark Races) + 12th Challenge Races, 2nd and 4th Hero and Dark Races, final fight of each Karate difficulty) """ - display_name = "Chao Race Checks" + display_name = "Chao Stadium Checks" option_all = 0 option_prize = 1 default = 0 +class ChaoStats(Range): + """ + Determines the highest level in each Chao Stat that grants checks + (Swim, Fly, Run, Power) + """ + display_name = "Chao Stats" + range_start = 0 + range_end = 99 + default = 0 + + +class ChaoStatsFrequency(Range): + """ + Determines how many levels in each Chao Stat grant checks (up to the maximum set in the `chao_stats` option) + `1` means every level is included, `2` means every other level is included, `3` means every third, and so on + """ + display_name = "Chao Stats Frequency" + range_start = 1 + range_end = 20 + default = 5 + + +class ChaoStatsStamina(Toggle): + """ + Determines whether Stamina is included in the `chao_stats` option + """ + display_name = "Chao Stats - Stamina" + + +class ChaoStatsHidden(Toggle): + """ + Determines whether the hidden stats (Luck and Intelligence) are included in the `chao_stats` option + """ + display_name = "Chao Stats - Luck and Intelligence" + + +class ChaoAnimalParts(Toggle): + """ + Determines whether giving Chao various animal parts grants checks + (73 Locations) + """ + display_name = "Chao Animal Parts" + + +class ChaoKindergarten(Choice): + """ + Determines whether learning the lessons from the Kindergarten Classroom grants checks + (WARNING: VERY SLOW) + None: No Kindergarten classes have checks + Basics: One class from each category (Drawing, Dance, Song, and Instrument) is a check (4 Locations) + Full: Every class is a check (23 Locations) + """ + display_name = "Chao Kindergarten Checks" + option_none = 0 + option_basics = 1 + option_full = 2 + default = 0 + + +class BlackMarketSlots(Range): + """ + Determines how many multiworld items are available to purchase from the Black Market + """ + display_name = "Black Market Slots" + range_start = 0 + range_end = 64 + default = 0 + + +class BlackMarketUnlockCosts(Choice): + """ + Determines how many Chao Coins are required to unlock sets of Black Market items + """ + display_name = "Black Market Unlock Costs" + option_low = 0 + option_medium = 1 + option_high = 2 + default = 1 + + +class BlackMarketPriceMultiplier(Range): + """ + Determines how many rings the Black Market items cost + The base ring costs of items in the Black Market range from 50-100, + and are then multiplied by this value + """ + display_name = "Black Market Price Multiplier" + range_start = 0 + range_end = 40 + default = 1 + + +class ShuffleStartingChaoEggs(DefaultOnToggle): + """ + Determines whether the starting Chao eggs in the gardens are random + """ + display_name = "Shuffle Starting Chao Eggs" + + +class ChaoEntranceRandomization(Toggle): + """ + Determines whether entrances in Chao World are randomized + """ + display_name = "Chao Entrance Randomization" + + class RequiredCannonsCoreMissions(Choice): """ Determines how many Cannon's Core missions must be completed (for Biolizard or Cannon's Core goals) @@ -657,24 +778,42 @@ class LogicDifficulty(Choice): sa2b_options: typing.Dict[str, type(Option)] = { "goal": Goal, + "mission_shuffle": MissionShuffle, "boss_rush_shuffle": BossRushShuffle, + "keysanity": Keysanity, "whistlesanity": Whistlesanity, "beetlesanity": Beetlesanity, "omosanity": Omosanity, "animalsanity": Animalsanity, "kart_race_checks": KartRaceChecks, + + "logic_difficulty": LogicDifficulty, "required_rank": RequiredRank, - "emblem_percentage_for_cannons_core": EmblemPercentageForCannonsCore, "required_cannons_core_missions": RequiredCannonsCoreMissions, + + "emblem_percentage_for_cannons_core": EmblemPercentageForCannonsCore, "number_of_level_gates": NumberOfLevelGates, "level_gate_distribution": LevelGateDistribution, "level_gate_costs": LevelGateCosts, "max_emblem_cap": MaximumEmblemCap, - "chao_garden_difficulty": ChaoGardenDifficulty, - "include_chao_karate": IncludeChaoKarate, - "chao_race_checks": ChaoRaceChecks, + + "chao_race_difficulty": ChaoRaceDifficulty, + "chao_karate_difficulty": ChaoKarateDifficulty, + "chao_stadium_checks": ChaoStadiumChecks, + "chao_stats": ChaoStats, + "chao_stats_frequency": ChaoStatsFrequency, + "chao_stats_stamina": ChaoStatsStamina, + "chao_stats_hidden": ChaoStatsHidden, + "chao_animal_parts": ChaoAnimalParts, + "chao_kindergarten": ChaoKindergarten, + "black_market_slots": BlackMarketSlots, + "black_market_unlock_costs": BlackMarketUnlockCosts, + "black_market_price_multiplier": BlackMarketPriceMultiplier, + "shuffle_starting_chao_eggs": ShuffleStartingChaoEggs, + "chao_entrance_randomization": ChaoEntranceRandomization, + "junk_fill_percentage": JunkFillPercentage, "trap_fill_percentage": TrapFillPercentage, "omochao_trap_weight": OmochaoTrapWeight, @@ -687,39 +826,46 @@ class LogicDifficulty(Choice): "ice_trap_weight": IceTrapWeight, "slow_trap_weight": SlowTrapWeight, "cutscene_trap_weight": CutsceneTrapWeight, + "reverse_trap_weight": ReverseTrapWeight, "pong_trap_weight": PongTrapWeight, "minigame_trap_difficulty": MinigameTrapDifficulty, - "ring_loss": RingLoss, - "ring_link": RingLink, + "sadx_music": SADXMusic, "music_shuffle": MusicShuffle, "voice_shuffle": VoiceShuffle, "narrator": Narrator, - "logic_difficulty": LogicDifficulty, + "ring_loss": RingLoss, + "speed_mission_count": SpeedMissionCount, "speed_mission_2": SpeedMission2, "speed_mission_3": SpeedMission3, "speed_mission_4": SpeedMission4, "speed_mission_5": SpeedMission5, + "mech_mission_count": MechMissionCount, "mech_mission_2": MechMission2, "mech_mission_3": MechMission3, "mech_mission_4": MechMission4, "mech_mission_5": MechMission5, + "hunt_mission_count": HuntMissionCount, "hunt_mission_2": HuntMission2, "hunt_mission_3": HuntMission3, "hunt_mission_4": HuntMission4, "hunt_mission_5": HuntMission5, + "kart_mission_count": KartMissionCount, "kart_mission_2": KartMission2, "kart_mission_3": KartMission3, "kart_mission_4": KartMission4, "kart_mission_5": KartMission5, + "cannons_core_mission_count": CannonsCoreMissionCount, "cannons_core_mission_2": CannonsCoreMission2, "cannons_core_mission_3": CannonsCoreMission3, "cannons_core_mission_4": CannonsCoreMission4, "cannons_core_mission_5": CannonsCoreMission5, + + "ring_link": RingLink, "death_link": DeathLink, } diff --git a/worlds/sa2b/Regions.py b/worlds/sa2b/Regions.py index da519283300a..fb6472d65df7 100644 --- a/worlds/sa2b/Regions.py +++ b/worlds/sa2b/Regions.py @@ -1,8 +1,14 @@ import typing +import math -from BaseClasses import MultiWorld, Region, Entrance +from BaseClasses import MultiWorld, Region, Entrance, ItemClassification +from worlds.AutoWorld import World from .Items import SA2BItem -from .Locations import SA2BLocation, boss_gate_location_table, boss_gate_set +from .Locations import SA2BLocation, boss_gate_location_table, boss_gate_set,\ + chao_stat_swim_table, chao_stat_fly_table, chao_stat_run_table,\ + chao_stat_power_table, chao_stat_stamina_table,\ + chao_stat_luck_table, chao_stat_intelligence_table, chao_animal_event_location_table,\ + chao_kindergarten_location_table, chao_kindergarten_basics_location_table, black_market_location_table from .Names import LocationName, ItemName from .GateBosses import get_boss_name, all_gate_bosses_table, king_boom_boo @@ -86,35 +92,37 @@ def __init__(self, emblems): ] -def create_regions(world, player: int, active_locations): - menu_region = create_region(world, player, active_locations, 'Menu', None) +def create_regions(multiworld: MultiWorld, world: World, player: int, active_locations): + menu_region = create_region(multiworld, player, active_locations, 'Menu', None) - gate_0_region = create_region(world, player, active_locations, 'Gate 0', None) + conditional_regions = [] + gate_0_region = create_region(multiworld, player, active_locations, 'Gate 0', None) + conditional_regions += [gate_0_region] - if world.number_of_level_gates[player].value >= 1: - gate_1_boss_region = create_region(world, player, active_locations, 'Gate 1 Boss', [LocationName.gate_1_boss]) - gate_1_region = create_region(world, player, active_locations, 'Gate 1', None) - world.regions += [gate_1_region, gate_1_boss_region] + if world.options.number_of_level_gates.value >= 1: + gate_1_boss_region = create_region(multiworld, player, active_locations, 'Gate 1 Boss', [LocationName.gate_1_boss]) + gate_1_region = create_region(multiworld, player, active_locations, 'Gate 1', None) + conditional_regions += [gate_1_region, gate_1_boss_region] - if world.number_of_level_gates[player].value >= 2: - gate_2_boss_region = create_region(world, player, active_locations, 'Gate 2 Boss', [LocationName.gate_2_boss]) - gate_2_region = create_region(world, player, active_locations, 'Gate 2', None) - world.regions += [gate_2_region, gate_2_boss_region] + if world.options.number_of_level_gates.value >= 2: + gate_2_boss_region = create_region(multiworld, player, active_locations, 'Gate 2 Boss', [LocationName.gate_2_boss]) + gate_2_region = create_region(multiworld, player, active_locations, 'Gate 2', None) + conditional_regions += [gate_2_region, gate_2_boss_region] - if world.number_of_level_gates[player].value >= 3: - gate_3_boss_region = create_region(world, player, active_locations, 'Gate 3 Boss', [LocationName.gate_3_boss]) - gate_3_region = create_region(world, player, active_locations, 'Gate 3', None) - world.regions += [gate_3_region, gate_3_boss_region] + if world.options.number_of_level_gates.value >= 3: + gate_3_boss_region = create_region(multiworld, player, active_locations, 'Gate 3 Boss', [LocationName.gate_3_boss]) + gate_3_region = create_region(multiworld, player, active_locations, 'Gate 3', None) + conditional_regions += [gate_3_region, gate_3_boss_region] - if world.number_of_level_gates[player].value >= 4: - gate_4_boss_region = create_region(world, player, active_locations, 'Gate 4 Boss', [LocationName.gate_4_boss]) - gate_4_region = create_region(world, player, active_locations, 'Gate 4', None) - world.regions += [gate_4_region, gate_4_boss_region] + if world.options.number_of_level_gates.value >= 4: + gate_4_boss_region = create_region(multiworld, player, active_locations, 'Gate 4 Boss', [LocationName.gate_4_boss]) + gate_4_region = create_region(multiworld, player, active_locations, 'Gate 4', None) + conditional_regions += [gate_4_region, gate_4_boss_region] - if world.number_of_level_gates[player].value >= 5: - gate_5_boss_region = create_region(world, player, active_locations, 'Gate 5 Boss', [LocationName.gate_5_boss]) - gate_5_region = create_region(world, player, active_locations, 'Gate 5', None) - world.regions += [gate_5_region, gate_5_boss_region] + if world.options.number_of_level_gates.value >= 5: + gate_5_boss_region = create_region(multiworld, player, active_locations, 'Gate 5 Boss', [LocationName.gate_5_boss]) + gate_5_region = create_region(multiworld, player, active_locations, 'Gate 5', None) + conditional_regions += [gate_5_region, gate_5_boss_region] city_escape_region_locations = [ LocationName.city_escape_1, @@ -171,7 +179,7 @@ def create_regions(world, player: int, active_locations): LocationName.city_escape_animal_20, LocationName.city_escape_upgrade, ] - city_escape_region = create_region(world, player, active_locations, LocationName.city_escape_region, + city_escape_region = create_region(multiworld, player, active_locations, LocationName.city_escape_region, city_escape_region_locations) metal_harbor_region_locations = [ @@ -206,7 +214,7 @@ def create_regions(world, player: int, active_locations): LocationName.metal_harbor_animal_14, LocationName.metal_harbor_upgrade, ] - metal_harbor_region = create_region(world, player, active_locations, LocationName.metal_harbor_region, + metal_harbor_region = create_region(multiworld, player, active_locations, LocationName.metal_harbor_region, metal_harbor_region_locations) green_forest_region_locations = [ @@ -245,7 +253,7 @@ def create_regions(world, player: int, active_locations): LocationName.green_forest_animal_18, LocationName.green_forest_upgrade, ] - green_forest_region = create_region(world, player, active_locations, LocationName.green_forest_region, + green_forest_region = create_region(multiworld, player, active_locations, LocationName.green_forest_region, green_forest_region_locations) pyramid_cave_region_locations = [ @@ -287,7 +295,7 @@ def create_regions(world, player: int, active_locations): LocationName.pyramid_cave_animal_19, LocationName.pyramid_cave_upgrade, ] - pyramid_cave_region = create_region(world, player, active_locations, LocationName.pyramid_cave_region, + pyramid_cave_region = create_region(multiworld, player, active_locations, LocationName.pyramid_cave_region, pyramid_cave_region_locations) crazy_gadget_region_locations = [ @@ -336,7 +344,7 @@ def create_regions(world, player: int, active_locations): LocationName.crazy_gadget_animal_16, LocationName.crazy_gadget_upgrade, ] - crazy_gadget_region = create_region(world, player, active_locations, LocationName.crazy_gadget_region, + crazy_gadget_region = create_region(multiworld, player, active_locations, LocationName.crazy_gadget_region, crazy_gadget_region_locations) final_rush_region_locations = [ @@ -372,7 +380,7 @@ def create_regions(world, player: int, active_locations): LocationName.final_rush_animal_16, LocationName.final_rush_upgrade, ] - final_rush_region = create_region(world, player, active_locations, LocationName.final_rush_region, + final_rush_region = create_region(multiworld, player, active_locations, LocationName.final_rush_region, final_rush_region_locations) prison_lane_region_locations = [ @@ -418,7 +426,7 @@ def create_regions(world, player: int, active_locations): LocationName.prison_lane_animal_15, LocationName.prison_lane_upgrade, ] - prison_lane_region = create_region(world, player, active_locations, LocationName.prison_lane_region, + prison_lane_region = create_region(multiworld, player, active_locations, LocationName.prison_lane_region, prison_lane_region_locations) mission_street_region_locations = [ @@ -464,7 +472,7 @@ def create_regions(world, player: int, active_locations): LocationName.mission_street_animal_16, LocationName.mission_street_upgrade, ] - mission_street_region = create_region(world, player, active_locations, LocationName.mission_street_region, + mission_street_region = create_region(multiworld, player, active_locations, LocationName.mission_street_region, mission_street_region_locations) route_101_region_locations = [ @@ -474,7 +482,7 @@ def create_regions(world, player: int, active_locations): LocationName.route_101_4, LocationName.route_101_5, ] - route_101_region = create_region(world, player, active_locations, LocationName.route_101_region, + route_101_region = create_region(multiworld, player, active_locations, LocationName.route_101_region, route_101_region_locations) hidden_base_region_locations = [ @@ -512,7 +520,7 @@ def create_regions(world, player: int, active_locations): LocationName.hidden_base_animal_15, LocationName.hidden_base_upgrade, ] - hidden_base_region = create_region(world, player, active_locations, LocationName.hidden_base_region, + hidden_base_region = create_region(multiworld, player, active_locations, LocationName.hidden_base_region, hidden_base_region_locations) eternal_engine_region_locations = [ @@ -559,7 +567,7 @@ def create_regions(world, player: int, active_locations): LocationName.eternal_engine_animal_15, LocationName.eternal_engine_upgrade, ] - eternal_engine_region = create_region(world, player, active_locations, LocationName.eternal_engine_region, + eternal_engine_region = create_region(multiworld, player, active_locations, LocationName.eternal_engine_region, eternal_engine_region_locations) wild_canyon_region_locations = [ @@ -597,7 +605,7 @@ def create_regions(world, player: int, active_locations): LocationName.wild_canyon_animal_10, LocationName.wild_canyon_upgrade, ] - wild_canyon_region = create_region(world, player, active_locations, LocationName.wild_canyon_region, + wild_canyon_region = create_region(multiworld, player, active_locations, LocationName.wild_canyon_region, wild_canyon_region_locations) pumpkin_hill_region_locations = [ @@ -635,7 +643,7 @@ def create_regions(world, player: int, active_locations): LocationName.pumpkin_hill_animal_11, LocationName.pumpkin_hill_upgrade, ] - pumpkin_hill_region = create_region(world, player, active_locations, LocationName.pumpkin_hill_region, + pumpkin_hill_region = create_region(multiworld, player, active_locations, LocationName.pumpkin_hill_region, pumpkin_hill_region_locations) aquatic_mine_region_locations = [ @@ -670,7 +678,7 @@ def create_regions(world, player: int, active_locations): LocationName.aquatic_mine_animal_10, LocationName.aquatic_mine_upgrade, ] - aquatic_mine_region = create_region(world, player, active_locations, LocationName.aquatic_mine_region, + aquatic_mine_region = create_region(multiworld, player, active_locations, LocationName.aquatic_mine_region, aquatic_mine_region_locations) death_chamber_region_locations = [ @@ -709,7 +717,7 @@ def create_regions(world, player: int, active_locations): LocationName.death_chamber_animal_10, LocationName.death_chamber_upgrade, ] - death_chamber_region = create_region(world, player, active_locations, LocationName.death_chamber_region, + death_chamber_region = create_region(multiworld, player, active_locations, LocationName.death_chamber_region, death_chamber_region_locations) meteor_herd_region_locations = [ @@ -741,7 +749,7 @@ def create_regions(world, player: int, active_locations): LocationName.meteor_herd_animal_11, LocationName.meteor_herd_upgrade, ] - meteor_herd_region = create_region(world, player, active_locations, LocationName.meteor_herd_region, + meteor_herd_region = create_region(multiworld, player, active_locations, LocationName.meteor_herd_region, meteor_herd_region_locations) radical_highway_region_locations = [ @@ -790,7 +798,7 @@ def create_regions(world, player: int, active_locations): LocationName.radical_highway_animal_20, LocationName.radical_highway_upgrade, ] - radical_highway_region = create_region(world, player, active_locations, LocationName.radical_highway_region, + radical_highway_region = create_region(multiworld, player, active_locations, LocationName.radical_highway_region, radical_highway_region_locations) white_jungle_region_locations = [ @@ -833,7 +841,7 @@ def create_regions(world, player: int, active_locations): LocationName.white_jungle_animal_16, LocationName.white_jungle_upgrade, ] - white_jungle_region = create_region(world, player, active_locations, LocationName.white_jungle_region, + white_jungle_region = create_region(multiworld, player, active_locations, LocationName.white_jungle_region, white_jungle_region_locations) sky_rail_region_locations = [ @@ -874,7 +882,7 @@ def create_regions(world, player: int, active_locations): LocationName.sky_rail_animal_20, LocationName.sky_rail_upgrade, ] - sky_rail_region = create_region(world, player, active_locations, LocationName.sky_rail_region, + sky_rail_region = create_region(multiworld, player, active_locations, LocationName.sky_rail_region, sky_rail_region_locations) final_chase_region_locations = [ @@ -910,7 +918,7 @@ def create_regions(world, player: int, active_locations): LocationName.final_chase_animal_17, LocationName.final_chase_upgrade, ] - final_chase_region = create_region(world, player, active_locations, LocationName.final_chase_region, + final_chase_region = create_region(multiworld, player, active_locations, LocationName.final_chase_region, final_chase_region_locations) iron_gate_region_locations = [ @@ -951,7 +959,7 @@ def create_regions(world, player: int, active_locations): LocationName.iron_gate_animal_15, LocationName.iron_gate_upgrade, ] - iron_gate_region = create_region(world, player, active_locations, LocationName.iron_gate_region, + iron_gate_region = create_region(multiworld, player, active_locations, LocationName.iron_gate_region, iron_gate_region_locations) sand_ocean_region_locations = [ @@ -988,7 +996,7 @@ def create_regions(world, player: int, active_locations): LocationName.sand_ocean_animal_15, LocationName.sand_ocean_upgrade, ] - sand_ocean_region = create_region(world, player, active_locations, LocationName.sand_ocean_region, + sand_ocean_region = create_region(multiworld, player, active_locations, LocationName.sand_ocean_region, sand_ocean_region_locations) lost_colony_region_locations = [ @@ -1028,7 +1036,7 @@ def create_regions(world, player: int, active_locations): LocationName.lost_colony_animal_14, LocationName.lost_colony_upgrade, ] - lost_colony_region = create_region(world, player, active_locations, LocationName.lost_colony_region, + lost_colony_region = create_region(multiworld, player, active_locations, LocationName.lost_colony_region, lost_colony_region_locations) weapons_bed_region_locations = [ @@ -1065,7 +1073,7 @@ def create_regions(world, player: int, active_locations): LocationName.weapons_bed_animal_15, LocationName.weapons_bed_upgrade, ] - weapons_bed_region = create_region(world, player, active_locations, LocationName.weapons_bed_region, + weapons_bed_region = create_region(multiworld, player, active_locations, LocationName.weapons_bed_region, weapons_bed_region_locations) cosmic_wall_region_locations = [ @@ -1101,7 +1109,7 @@ def create_regions(world, player: int, active_locations): LocationName.cosmic_wall_animal_15, LocationName.cosmic_wall_upgrade, ] - cosmic_wall_region = create_region(world, player, active_locations, LocationName.cosmic_wall_region, + cosmic_wall_region = create_region(multiworld, player, active_locations, LocationName.cosmic_wall_region, cosmic_wall_region_locations) dry_lagoon_region_locations = [ @@ -1138,9 +1146,10 @@ def create_regions(world, player: int, active_locations): LocationName.dry_lagoon_animal_8, LocationName.dry_lagoon_animal_9, LocationName.dry_lagoon_animal_10, + LocationName.dry_lagoon_animal_11, LocationName.dry_lagoon_upgrade, ] - dry_lagoon_region = create_region(world, player, active_locations, LocationName.dry_lagoon_region, + dry_lagoon_region = create_region(multiworld, player, active_locations, LocationName.dry_lagoon_region, dry_lagoon_region_locations) egg_quarters_region_locations = [ @@ -1176,7 +1185,7 @@ def create_regions(world, player: int, active_locations): LocationName.egg_quarters_animal_10, LocationName.egg_quarters_upgrade, ] - egg_quarters_region = create_region(world, player, active_locations, LocationName.egg_quarters_region, + egg_quarters_region = create_region(multiworld, player, active_locations, LocationName.egg_quarters_region, egg_quarters_region_locations) security_hall_region_locations = [ @@ -1213,7 +1222,7 @@ def create_regions(world, player: int, active_locations): LocationName.security_hall_animal_8, LocationName.security_hall_upgrade, ] - security_hall_region = create_region(world, player, active_locations, LocationName.security_hall_region, + security_hall_region = create_region(multiworld, player, active_locations, LocationName.security_hall_region, security_hall_region_locations) route_280_region_locations = [ @@ -1223,7 +1232,7 @@ def create_regions(world, player: int, active_locations): LocationName.route_280_4, LocationName.route_280_5, ] - route_280_region = create_region(world, player, active_locations, LocationName.route_280_region, + route_280_region = create_region(multiworld, player, active_locations, LocationName.route_280_region, route_280_region_locations) mad_space_region_locations = [ @@ -1257,7 +1266,7 @@ def create_regions(world, player: int, active_locations): LocationName.mad_space_animal_10, LocationName.mad_space_upgrade, ] - mad_space_region = create_region(world, player, active_locations, LocationName.mad_space_region, + mad_space_region = create_region(multiworld, player, active_locations, LocationName.mad_space_region, mad_space_region_locations) cannon_core_region_locations = [ @@ -1305,10 +1314,10 @@ def create_regions(world, player: int, active_locations): LocationName.cannon_core_animal_19, LocationName.cannon_core_beetle, ] - cannon_core_region = create_region(world, player, active_locations, LocationName.cannon_core_region, + cannon_core_region = create_region(multiworld, player, active_locations, LocationName.cannon_core_region, cannon_core_region_locations) - chao_garden_beginner_region_locations = [ + chao_race_beginner_region_locations = [ LocationName.chao_race_crab_pool_1, LocationName.chao_race_crab_pool_2, LocationName.chao_race_crab_pool_3, @@ -1321,13 +1330,21 @@ def create_regions(world, player: int, active_locations): LocationName.chao_race_block_canyon_1, LocationName.chao_race_block_canyon_2, LocationName.chao_race_block_canyon_3, - - LocationName.chao_beginner_karate, ] - chao_garden_beginner_region = create_region(world, player, active_locations, LocationName.chao_garden_beginner_region, - chao_garden_beginner_region_locations) + chao_race_beginner_region = create_region(multiworld, player, active_locations, LocationName.chao_race_beginner_region, + chao_race_beginner_region_locations) + + chao_karate_beginner_region_locations = [ + LocationName.chao_beginner_karate_1, + LocationName.chao_beginner_karate_2, + LocationName.chao_beginner_karate_3, + LocationName.chao_beginner_karate_4, + LocationName.chao_beginner_karate_5, + ] + chao_karate_beginner_region = create_region(multiworld, player, active_locations, LocationName.chao_karate_beginner_region, + chao_karate_beginner_region_locations) - chao_garden_intermediate_region_locations = [ + chao_race_intermediate_region_locations = [ LocationName.chao_race_challenge_1, LocationName.chao_race_challenge_2, LocationName.chao_race_challenge_3, @@ -1350,13 +1367,21 @@ def create_regions(world, player: int, active_locations): LocationName.chao_race_dark_2, LocationName.chao_race_dark_3, LocationName.chao_race_dark_4, - - LocationName.chao_standard_karate, ] - chao_garden_intermediate_region = create_region(world, player, active_locations, LocationName.chao_garden_intermediate_region, - chao_garden_intermediate_region_locations) + chao_race_intermediate_region = create_region(multiworld, player, active_locations, LocationName.chao_race_intermediate_region, + chao_race_intermediate_region_locations) + + chao_karate_intermediate_region_locations = [ + LocationName.chao_standard_karate_1, + LocationName.chao_standard_karate_2, + LocationName.chao_standard_karate_3, + LocationName.chao_standard_karate_4, + LocationName.chao_standard_karate_5, + ] + chao_karate_intermediate_region = create_region(multiworld, player, active_locations, LocationName.chao_karate_intermediate_region, + chao_karate_intermediate_region_locations) - chao_garden_expert_region_locations = [ + chao_race_expert_region_locations = [ LocationName.chao_race_aquamarine_1, LocationName.chao_race_aquamarine_2, LocationName.chao_race_aquamarine_3, @@ -1387,15 +1412,266 @@ def create_regions(world, player: int, active_locations): LocationName.chao_race_diamond_3, LocationName.chao_race_diamond_4, LocationName.chao_race_diamond_5, - - LocationName.chao_expert_karate, - LocationName.chao_super_karate, ] - chao_garden_expert_region = create_region(world, player, active_locations, LocationName.chao_garden_expert_region, - chao_garden_expert_region_locations) + chao_race_expert_region = create_region(multiworld, player, active_locations, LocationName.chao_race_expert_region, + chao_race_expert_region_locations) + + chao_karate_expert_region_locations = [ + LocationName.chao_expert_karate_1, + LocationName.chao_expert_karate_2, + LocationName.chao_expert_karate_3, + LocationName.chao_expert_karate_4, + LocationName.chao_expert_karate_5, + ] + chao_karate_expert_region = create_region(multiworld, player, active_locations, LocationName.chao_karate_expert_region, + chao_karate_expert_region_locations) + + chao_karate_super_region_locations = [ + LocationName.chao_super_karate_1, + LocationName.chao_super_karate_2, + LocationName.chao_super_karate_3, + LocationName.chao_super_karate_4, + LocationName.chao_super_karate_5, + ] + chao_karate_super_region = create_region(multiworld, player, active_locations, LocationName.chao_karate_super_region, + chao_karate_super_region_locations) + + if world.options.goal == 7 or world.options.chao_animal_parts: + animal_penguin_region_locations = [ + LocationName.animal_penguin, + LocationName.chao_penguin_arms, + LocationName.chao_penguin_forehead, + LocationName.chao_penguin_legs, + ] + animal_penguin_region = create_region(multiworld, player, active_locations, LocationName.animal_penguin, + animal_penguin_region_locations) + conditional_regions += [animal_penguin_region] + + animal_seal_region_locations = [ + LocationName.animal_seal, + LocationName.chao_seal_arms, + LocationName.chao_seal_tail, + ] + animal_seal_region = create_region(multiworld, player, active_locations, LocationName.animal_seal, + animal_seal_region_locations) + conditional_regions += [animal_seal_region] + + animal_otter_region_locations = [ + LocationName.animal_otter, + LocationName.chao_otter_arms, + LocationName.chao_otter_ears, + LocationName.chao_otter_face, + LocationName.chao_otter_legs, + LocationName.chao_otter_tail, + ] + animal_otter_region = create_region(multiworld, player, active_locations, LocationName.animal_otter, + animal_otter_region_locations) + conditional_regions += [animal_otter_region] + + animal_rabbit_region_locations = [ + LocationName.animal_rabbit, + LocationName.chao_rabbit_arms, + LocationName.chao_rabbit_ears, + LocationName.chao_rabbit_legs, + LocationName.chao_rabbit_tail, + ] + animal_rabbit_region = create_region(multiworld, player, active_locations, LocationName.animal_rabbit, + animal_rabbit_region_locations) + conditional_regions += [animal_rabbit_region] + + animal_cheetah_region_locations = [ + LocationName.animal_cheetah, + LocationName.chao_cheetah_arms, + LocationName.chao_cheetah_ears, + LocationName.chao_cheetah_legs, + LocationName.chao_cheetah_tail, + ] + animal_cheetah_region = create_region(multiworld, player, active_locations, LocationName.animal_cheetah, + animal_cheetah_region_locations) + conditional_regions += [animal_cheetah_region] + + animal_warthog_region_locations = [ + LocationName.animal_warthog, + LocationName.chao_warthog_arms, + LocationName.chao_warthog_ears, + LocationName.chao_warthog_face, + LocationName.chao_warthog_legs, + LocationName.chao_warthog_tail, + ] + animal_warthog_region = create_region(multiworld, player, active_locations, LocationName.animal_warthog, + animal_warthog_region_locations) + conditional_regions += [animal_warthog_region] + + animal_bear_region_locations = [ + LocationName.animal_bear, + LocationName.chao_bear_arms, + LocationName.chao_bear_ears, + LocationName.chao_bear_legs, + ] + animal_bear_region = create_region(multiworld, player, active_locations, LocationName.animal_bear, + animal_bear_region_locations) + conditional_regions += [animal_bear_region] + + animal_tiger_region_locations = [ + LocationName.animal_tiger, + LocationName.chao_tiger_arms, + LocationName.chao_tiger_ears, + LocationName.chao_tiger_legs, + LocationName.chao_tiger_tail, + ] + animal_tiger_region = create_region(multiworld, player, active_locations, LocationName.animal_tiger, + animal_tiger_region_locations) + conditional_regions += [animal_tiger_region] + + animal_gorilla_region_locations = [ + LocationName.animal_gorilla, + LocationName.chao_gorilla_arms, + LocationName.chao_gorilla_ears, + LocationName.chao_gorilla_forehead, + LocationName.chao_gorilla_legs, + ] + animal_gorilla_region = create_region(multiworld, player, active_locations, LocationName.animal_gorilla, + animal_gorilla_region_locations) + conditional_regions += [animal_gorilla_region] + + animal_peacock_region_locations = [ + LocationName.animal_peacock, + LocationName.chao_peacock_forehead, + LocationName.chao_peacock_legs, + LocationName.chao_peacock_tail, + LocationName.chao_peacock_wings, + ] + animal_peacock_region = create_region(multiworld, player, active_locations, LocationName.animal_peacock, + animal_peacock_region_locations) + conditional_regions += [animal_peacock_region] + + animal_parrot_region_locations = [ + LocationName.animal_parrot, + LocationName.chao_parrot_forehead, + LocationName.chao_parrot_legs, + LocationName.chao_parrot_tail, + LocationName.chao_parrot_wings, + ] + animal_parrot_region = create_region(multiworld, player, active_locations, LocationName.animal_parrot, + animal_parrot_region_locations) + conditional_regions += [animal_parrot_region] + + animal_condor_region_locations = [ + LocationName.animal_condor, + LocationName.chao_condor_ears, + LocationName.chao_condor_legs, + LocationName.chao_condor_tail, + LocationName.chao_condor_wings, + ] + animal_condor_region = create_region(multiworld, player, active_locations, LocationName.animal_condor, + animal_condor_region_locations) + conditional_regions += [animal_condor_region] + + animal_skunk_region_locations = [ + LocationName.animal_skunk, + LocationName.chao_skunk_arms, + LocationName.chao_skunk_forehead, + LocationName.chao_skunk_legs, + LocationName.chao_skunk_tail, + ] + animal_skunk_region = create_region(multiworld, player, active_locations, LocationName.animal_skunk, + animal_skunk_region_locations) + conditional_regions += [animal_skunk_region] + + animal_sheep_region_locations = [ + LocationName.animal_sheep, + LocationName.chao_sheep_arms, + LocationName.chao_sheep_ears, + LocationName.chao_sheep_legs, + LocationName.chao_sheep_horn, + LocationName.chao_sheep_tail, + ] + animal_sheep_region = create_region(multiworld, player, active_locations, LocationName.animal_sheep, + animal_sheep_region_locations) + conditional_regions += [animal_sheep_region] + + animal_raccoon_region_locations = [ + LocationName.animal_raccoon, + LocationName.chao_raccoon_arms, + LocationName.chao_raccoon_ears, + LocationName.chao_raccoon_legs, + ] + animal_raccoon_region = create_region(multiworld, player, active_locations, LocationName.animal_raccoon, + animal_raccoon_region_locations) + conditional_regions += [animal_raccoon_region] + + animal_halffish_region_locations = [ + LocationName.animal_halffish, + ] + animal_halffish_region = create_region(multiworld, player, active_locations, LocationName.animal_halffish, + animal_halffish_region_locations) + conditional_regions += [animal_halffish_region] + + animal_skeleton_dog_region_locations = [ + LocationName.animal_skeleton_dog, + ] + animal_skeleton_dog_region = create_region(multiworld, player, active_locations, LocationName.animal_skeleton_dog, + animal_skeleton_dog_region_locations) + conditional_regions += [animal_skeleton_dog_region] + + animal_bat_region_locations = [ + LocationName.animal_bat, + ] + animal_bat_region = create_region(multiworld, player, active_locations, LocationName.animal_bat, + animal_bat_region_locations) + conditional_regions += [animal_bat_region] + + animal_dragon_region_locations = [ + LocationName.animal_dragon, + LocationName.chao_dragon_arms, + LocationName.chao_dragon_ears, + LocationName.chao_dragon_legs, + LocationName.chao_dragon_horn, + LocationName.chao_dragon_tail, + LocationName.chao_dragon_wings, + ] + animal_dragon_region = create_region(multiworld, player, active_locations, LocationName.animal_dragon, + animal_dragon_region_locations) + conditional_regions += [animal_dragon_region] + + animal_unicorn_region_locations = [ + LocationName.animal_unicorn, + LocationName.chao_unicorn_arms, + LocationName.chao_unicorn_ears, + LocationName.chao_unicorn_forehead, + LocationName.chao_unicorn_legs, + LocationName.chao_unicorn_tail, + ] + animal_unicorn_region = create_region(multiworld, player, active_locations, LocationName.animal_unicorn, + animal_unicorn_region_locations) + conditional_regions += [animal_unicorn_region] + + animal_phoenix_region_locations = [ + LocationName.animal_phoenix, + LocationName.chao_phoenix_forehead, + LocationName.chao_phoenix_legs, + LocationName.chao_phoenix_tail, + LocationName.chao_phoenix_wings, + ] + animal_phoenix_region = create_region(multiworld, player, active_locations, LocationName.animal_phoenix, + animal_phoenix_region_locations) + conditional_regions += [animal_phoenix_region] + + if world.options.chao_kindergarten: + chao_kindergarten_region_locations = list(chao_kindergarten_location_table.keys()) + list(chao_kindergarten_basics_location_table.keys()) + chao_kindergarten_region = create_region(multiworld, player, active_locations, LocationName.chao_kindergarten_region, + chao_kindergarten_region_locations) + conditional_regions += [chao_kindergarten_region] + + if world.options.black_market_slots.value > 0: + + black_market_region_locations = list(black_market_location_table.keys()) + black_market_region = create_region(multiworld, player, active_locations, LocationName.black_market_region, + black_market_region_locations) + conditional_regions += [black_market_region] kart_race_beginner_region_locations = [] - if world.kart_race_checks[player] == 2: + if world.options.kart_race_checks == 2: kart_race_beginner_region_locations.extend([ LocationName.kart_race_beginner_sonic, LocationName.kart_race_beginner_tails, @@ -1404,13 +1680,13 @@ def create_regions(world, player: int, active_locations): LocationName.kart_race_beginner_eggman, LocationName.kart_race_beginner_rouge, ]) - if world.kart_race_checks[player] == 1: + if world.options.kart_race_checks == 1: kart_race_beginner_region_locations.append(LocationName.kart_race_beginner) - kart_race_beginner_region = create_region(world, player, active_locations, LocationName.kart_race_beginner_region, + kart_race_beginner_region = create_region(multiworld, player, active_locations, LocationName.kart_race_beginner_region, kart_race_beginner_region_locations) kart_race_standard_region_locations = [] - if world.kart_race_checks[player] == 2: + if world.options.kart_race_checks == 2: kart_race_standard_region_locations.extend([ LocationName.kart_race_standard_sonic, LocationName.kart_race_standard_tails, @@ -1419,13 +1695,13 @@ def create_regions(world, player: int, active_locations): LocationName.kart_race_standard_eggman, LocationName.kart_race_standard_rouge, ]) - if world.kart_race_checks[player] == 1: + if world.options.kart_race_checks == 1: kart_race_standard_region_locations.append(LocationName.kart_race_standard) - kart_race_standard_region = create_region(world, player, active_locations, LocationName.kart_race_standard_region, + kart_race_standard_region = create_region(multiworld, player, active_locations, LocationName.kart_race_standard_region, kart_race_standard_region_locations) kart_race_expert_region_locations = [] - if world.kart_race_checks[player] == 2: + if world.options.kart_race_checks == 2: kart_race_expert_region_locations.extend([ LocationName.kart_race_expert_sonic, LocationName.kart_race_expert_tails, @@ -1434,51 +1710,56 @@ def create_regions(world, player: int, active_locations): LocationName.kart_race_expert_eggman, LocationName.kart_race_expert_rouge, ]) - if world.kart_race_checks[player] == 1: + if world.options.kart_race_checks == 1: kart_race_expert_region_locations.append(LocationName.kart_race_expert) - kart_race_expert_region = create_region(world, player, active_locations, LocationName.kart_race_expert_region, + kart_race_expert_region = create_region(multiworld, player, active_locations, LocationName.kart_race_expert_region, kart_race_expert_region_locations) - if world.goal[player] == 3: + if world.options.goal == 3: grand_prix_region_locations = [ LocationName.grand_prix, ] - grand_prix_region = create_region(world, player, active_locations, LocationName.grand_prix_region, + grand_prix_region = create_region(multiworld, player, active_locations, LocationName.grand_prix_region, grand_prix_region_locations) - world.regions += [grand_prix_region] - - if world.goal[player] in [0, 2, 4, 5, 6]: + conditional_regions += [grand_prix_region] + elif world.options.goal in [0, 2, 4, 5, 6]: biolizard_region_locations = [ LocationName.finalhazard, ] - biolizard_region = create_region(world, player, active_locations, LocationName.biolizard_region, + biolizard_region = create_region(multiworld, player, active_locations, LocationName.biolizard_region, biolizard_region_locations) - world.regions += [biolizard_region] + conditional_regions += [biolizard_region] + elif world.options.goal == 7: + chaos_chao_region_locations = [ + LocationName.chaos_chao, + ] + chaos_chao_region = create_region(multiworld, player, active_locations, LocationName.chaos_chao_region, + chaos_chao_region_locations) + conditional_regions += [chaos_chao_region] - if world.goal[player] in [1, 2]: + if world.options.goal in [1, 2]: green_hill_region_locations = [ LocationName.green_hill, LocationName.green_hill_chao_1, #LocationName.green_hill_animal_1, ] - green_hill_region = create_region(world, player, active_locations, LocationName.green_hill_region, + green_hill_region = create_region(multiworld, player, active_locations, LocationName.green_hill_region, green_hill_region_locations) - world.regions += [green_hill_region] + conditional_regions += [green_hill_region] - if world.goal[player] in [4, 5, 6]: + if world.options.goal in [4, 5, 6]: for i in range(16): boss_region_locations = [ "Boss Rush - " + str(i + 1), ] - boss_region = create_region(world, player, active_locations, "Boss Rush " + str(i + 1), + boss_region = create_region(multiworld, player, active_locations, "Boss Rush " + str(i + 1), boss_region_locations) - world.regions += [boss_region] + conditional_regions += [boss_region] # Set up the regions correctly. - world.regions += [ + multiworld.regions += [ menu_region, - gate_0_region, city_escape_region, metal_harbor_region, green_forest_region, @@ -1510,32 +1791,38 @@ def create_regions(world, player: int, active_locations): route_280_region, mad_space_region, cannon_core_region, - chao_garden_beginner_region, - chao_garden_intermediate_region, - chao_garden_expert_region, + chao_race_beginner_region, + chao_karate_beginner_region, + chao_race_intermediate_region, + chao_karate_intermediate_region, + chao_race_expert_region, + chao_karate_expert_region, + chao_karate_super_region, kart_race_beginner_region, kart_race_standard_region, kart_race_expert_region, ] + multiworld.regions += conditional_regions -def connect_regions(world, player, gates: typing.List[LevelGate], cannon_core_emblems, gate_bosses, boss_rush_bosses, first_cannons_core_mission: str, final_cannons_core_mission: str): + +def connect_regions(multiworld: MultiWorld, world: World, player: int, gates: typing.List[LevelGate], cannon_core_emblems, gate_bosses, boss_rush_bosses, first_cannons_core_mission: str, final_cannons_core_mission: str): names: typing.Dict[str, int] = {} - connect(world, player, names, 'Menu', LocationName.gate_0_region) - connect(world, player, names, LocationName.gate_0_region, LocationName.cannon_core_region, + connect(multiworld, player, names, 'Menu', LocationName.gate_0_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.cannon_core_region, lambda state: (state.has(ItemName.emblem, player, cannon_core_emblems))) - if world.goal[player] == 0: + if world.options.goal == 0: required_mission_name = first_cannons_core_mission - if world.required_cannons_core_missions[player].value == 1: + if world.options.required_cannons_core_missions.value == 1: required_mission_name = final_cannons_core_mission - connect(world, player, names, LocationName.cannon_core_region, LocationName.biolizard_region, + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.biolizard_region, lambda state: (state.can_reach(required_mission_name, "Location", player))) - elif world.goal[player] in [1, 2]: - connect(world, player, names, 'Menu', LocationName.green_hill_region, + elif world.options.goal in [1, 2]: + connect(multiworld, player, names, 'Menu', LocationName.green_hill_region, lambda state: (state.has(ItemName.white_emerald, player) and state.has(ItemName.red_emerald, player) and state.has(ItemName.cyan_emerald, player) and @@ -1543,23 +1830,23 @@ def connect_regions(world, player, gates: typing.List[LevelGate], cannon_core_em state.has(ItemName.green_emerald, player) and state.has(ItemName.yellow_emerald, player) and state.has(ItemName.blue_emerald, player))) - if world.goal[player] == 2: - connect(world, player, names, LocationName.green_hill_region, LocationName.biolizard_region) - elif world.goal[player] == 3: - connect(world, player, names, LocationName.kart_race_expert_region, LocationName.grand_prix_region) - elif world.goal[player] in [4, 5, 6]: - if world.goal[player] == 4: - connect(world, player, names, LocationName.gate_0_region, LocationName.boss_rush_1_region) - elif world.goal[player] == 5: + if world.options.goal == 2: + connect(multiworld, player, names, LocationName.green_hill_region, LocationName.biolizard_region) + elif world.options.goal == 3: + connect(multiworld, player, names, LocationName.kart_race_expert_region, LocationName.grand_prix_region) + elif world.options.goal in [4, 5, 6]: + if world.options.goal == 4: + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.boss_rush_1_region) + elif world.options.goal == 5: required_mission_name = first_cannons_core_mission - if world.required_cannons_core_missions[player].value == 1: + if world.options.required_cannons_core_missions.value == 1: required_mission_name = final_cannons_core_mission - connect(world, player, names, LocationName.cannon_core_region, LocationName.boss_rush_1_region, + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.boss_rush_1_region, lambda state: (state.can_reach(required_mission_name, "Location", player))) - elif world.goal[player] == 6: - connect(world, player, names, LocationName.gate_0_region, LocationName.boss_rush_1_region, + elif world.options.goal == 6: + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.boss_rush_1_region, lambda state: (state.has(ItemName.white_emerald, player) and state.has(ItemName.red_emerald, player) and state.has(ItemName.cyan_emerald, player) and @@ -1570,134 +1857,576 @@ def connect_regions(world, player, gates: typing.List[LevelGate], cannon_core_em for i in range(15): if boss_rush_bosses[i] == all_gate_bosses_table[king_boom_boo]: - connect(world, player, names, "Boss Rush " + str(i + 1), "Boss Rush " + str(i + 2), + connect(multiworld, player, names, "Boss Rush " + str(i + 1), "Boss Rush " + str(i + 2), lambda state: (state.has(ItemName.knuckles_shovel_claws, player))) else: - connect(world, player, names, "Boss Rush " + str(i + 1), "Boss Rush " + str(i + 2)) + connect(multiworld, player, names, "Boss Rush " + str(i + 1), "Boss Rush " + str(i + 2)) - connect(world, player, names, LocationName.boss_rush_16_region, LocationName.biolizard_region) + connect(multiworld, player, names, LocationName.boss_rush_16_region, LocationName.biolizard_region) + elif world.options.goal == 7: + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chaos_chao, + lambda state: (state.has_all(chao_animal_event_location_table.keys(), player))) for i in range(len(gates[0].gate_levels)): - connect(world, player, names, LocationName.gate_0_region, shuffleable_regions[gates[0].gate_levels[i]]) + connect(multiworld, player, names, LocationName.gate_0_region, shuffleable_regions[gates[0].gate_levels[i]]) gates_len = len(gates) if gates_len >= 2: - connect(world, player, names, LocationName.gate_0_region, LocationName.gate_1_boss_region, + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.gate_1_boss_region, lambda state: (state.has(ItemName.emblem, player, gates[1].gate_emblem_count))) if gate_bosses[1] == all_gate_bosses_table[king_boom_boo]: - connect(world, player, names, LocationName.gate_1_boss_region, LocationName.gate_1_region, + connect(multiworld, player, names, LocationName.gate_1_boss_region, LocationName.gate_1_region, lambda state: (state.has(ItemName.knuckles_shovel_claws, player))) else: - connect(world, player, names, LocationName.gate_1_boss_region, LocationName.gate_1_region) + connect(multiworld, player, names, LocationName.gate_1_boss_region, LocationName.gate_1_region) for i in range(len(gates[1].gate_levels)): - connect(world, player, names, LocationName.gate_1_region, shuffleable_regions[gates[1].gate_levels[i]]) + connect(multiworld, player, names, LocationName.gate_1_region, shuffleable_regions[gates[1].gate_levels[i]]) if gates_len >= 3: - connect(world, player, names, LocationName.gate_1_region, LocationName.gate_2_boss_region, + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.gate_2_boss_region, lambda state: (state.has(ItemName.emblem, player, gates[2].gate_emblem_count))) if gate_bosses[2] == all_gate_bosses_table[king_boom_boo]: - connect(world, player, names, LocationName.gate_2_boss_region, LocationName.gate_2_region, + connect(multiworld, player, names, LocationName.gate_2_boss_region, LocationName.gate_2_region, lambda state: (state.has(ItemName.knuckles_shovel_claws, player))) else: - connect(world, player, names, LocationName.gate_2_boss_region, LocationName.gate_2_region) + connect(multiworld, player, names, LocationName.gate_2_boss_region, LocationName.gate_2_region) for i in range(len(gates[2].gate_levels)): - connect(world, player, names, LocationName.gate_2_region, shuffleable_regions[gates[2].gate_levels[i]]) + connect(multiworld, player, names, LocationName.gate_2_region, shuffleable_regions[gates[2].gate_levels[i]]) if gates_len >= 4: - connect(world, player, names, LocationName.gate_2_region, LocationName.gate_3_boss_region, + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.gate_3_boss_region, lambda state: (state.has(ItemName.emblem, player, gates[3].gate_emblem_count))) if gate_bosses[3] == all_gate_bosses_table[king_boom_boo]: - connect(world, player, names, LocationName.gate_3_boss_region, LocationName.gate_3_region, + connect(multiworld, player, names, LocationName.gate_3_boss_region, LocationName.gate_3_region, lambda state: (state.has(ItemName.knuckles_shovel_claws, player))) else: - connect(world, player, names, LocationName.gate_3_boss_region, LocationName.gate_3_region) + connect(multiworld, player, names, LocationName.gate_3_boss_region, LocationName.gate_3_region) for i in range(len(gates[3].gate_levels)): - connect(world, player, names, LocationName.gate_3_region, shuffleable_regions[gates[3].gate_levels[i]]) + connect(multiworld, player, names, LocationName.gate_3_region, shuffleable_regions[gates[3].gate_levels[i]]) if gates_len >= 5: - connect(world, player, names, LocationName.gate_3_region, LocationName.gate_4_boss_region, + connect(multiworld, player, names, LocationName.gate_3_region, LocationName.gate_4_boss_region, lambda state: (state.has(ItemName.emblem, player, gates[4].gate_emblem_count))) if gate_bosses[4] == all_gate_bosses_table[king_boom_boo]: - connect(world, player, names, LocationName.gate_4_boss_region, LocationName.gate_4_region, + connect(multiworld, player, names, LocationName.gate_4_boss_region, LocationName.gate_4_region, lambda state: (state.has(ItemName.knuckles_shovel_claws, player))) else: - connect(world, player, names, LocationName.gate_4_boss_region, LocationName.gate_4_region) + connect(multiworld, player, names, LocationName.gate_4_boss_region, LocationName.gate_4_region) for i in range(len(gates[4].gate_levels)): - connect(world, player, names, LocationName.gate_4_region, shuffleable_regions[gates[4].gate_levels[i]]) + connect(multiworld, player, names, LocationName.gate_4_region, shuffleable_regions[gates[4].gate_levels[i]]) if gates_len >= 6: - connect(world, player, names, LocationName.gate_4_region, LocationName.gate_5_boss_region, + connect(multiworld, player, names, LocationName.gate_4_region, LocationName.gate_5_boss_region, lambda state: (state.has(ItemName.emblem, player, gates[5].gate_emblem_count))) if gate_bosses[5] == all_gate_bosses_table[king_boom_boo]: - connect(world, player, names, LocationName.gate_5_boss_region, LocationName.gate_5_region, + connect(multiworld, player, names, LocationName.gate_5_boss_region, LocationName.gate_5_region, lambda state: (state.has(ItemName.knuckles_shovel_claws, player))) else: - connect(world, player, names, LocationName.gate_5_boss_region, LocationName.gate_5_region) + connect(multiworld, player, names, LocationName.gate_5_boss_region, LocationName.gate_5_region) for i in range(len(gates[5].gate_levels)): - connect(world, player, names, LocationName.gate_5_region, shuffleable_regions[gates[5].gate_levels[i]]) + connect(multiworld, player, names, LocationName.gate_5_region, shuffleable_regions[gates[5].gate_levels[i]]) if gates_len == 1: - connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_beginner_region) - connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_intermediate_region) - connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_expert_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_race_intermediate_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_race_expert_region) + + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_karate_beginner_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_karate_intermediate_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_karate_expert_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_karate_super_region) + + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.kart_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.kart_race_standard_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.kart_race_expert_region) - connect(world, player, names, LocationName.gate_0_region, LocationName.kart_race_beginner_region) - connect(world, player, names, LocationName.gate_0_region, LocationName.kart_race_standard_region) - connect(world, player, names, LocationName.gate_0_region, LocationName.kart_race_expert_region) + if world.options.chao_kindergarten: + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_kindergarten_region) elif gates_len == 2: - connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_beginner_region) - connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_intermediate_region) - connect(world, player, names, LocationName.gate_1_region, LocationName.chao_garden_expert_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_race_intermediate_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_race_expert_region) + + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_karate_beginner_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_karate_intermediate_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_karate_expert_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_karate_super_region) + + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.kart_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.kart_race_standard_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.kart_race_expert_region) - connect(world, player, names, LocationName.gate_0_region, LocationName.kart_race_beginner_region) - connect(world, player, names, LocationName.gate_0_region, LocationName.kart_race_standard_region) - connect(world, player, names, LocationName.gate_1_region, LocationName.kart_race_expert_region) + if world.options.chao_kindergarten: + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_kindergarten_region) elif gates_len == 3: - connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_beginner_region) - connect(world, player, names, LocationName.gate_1_region, LocationName.chao_garden_intermediate_region) - connect(world, player, names, LocationName.gate_2_region, LocationName.chao_garden_expert_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_race_intermediate_region) + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.chao_race_expert_region) - connect(world, player, names, LocationName.gate_0_region, LocationName.kart_race_beginner_region) - connect(world, player, names, LocationName.gate_1_region, LocationName.kart_race_standard_region) - connect(world, player, names, LocationName.gate_2_region, LocationName.kart_race_expert_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_karate_beginner_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_karate_intermediate_region) + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.chao_karate_expert_region) + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.chao_karate_super_region) + + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.kart_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.kart_race_standard_region) + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.kart_race_expert_region) + + if world.options.chao_kindergarten: + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_kindergarten_region) elif gates_len == 4: - connect(world, player, names, LocationName.gate_0_region, LocationName.chao_garden_beginner_region) - connect(world, player, names, LocationName.gate_1_region, LocationName.chao_garden_intermediate_region) - connect(world, player, names, LocationName.gate_3_region, LocationName.chao_garden_expert_region) + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_race_intermediate_region) + connect(multiworld, player, names, LocationName.gate_3_region, LocationName.chao_race_expert_region) + + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.chao_karate_beginner_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_karate_intermediate_region) + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.chao_karate_expert_region) + connect(multiworld, player, names, LocationName.gate_3_region, LocationName.chao_karate_super_region) + + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.kart_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.kart_race_standard_region) + connect(multiworld, player, names, LocationName.gate_3_region, LocationName.kart_race_expert_region) - connect(world, player, names, LocationName.gate_0_region, LocationName.kart_race_beginner_region) - connect(world, player, names, LocationName.gate_1_region, LocationName.kart_race_standard_region) - connect(world, player, names, LocationName.gate_3_region, LocationName.kart_race_expert_region) + if world.options.chao_kindergarten: + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.chao_kindergarten_region) elif gates_len == 5: - connect(world, player, names, LocationName.gate_1_region, LocationName.chao_garden_beginner_region) - connect(world, player, names, LocationName.gate_2_region, LocationName.chao_garden_intermediate_region) - connect(world, player, names, LocationName.gate_3_region, LocationName.chao_garden_expert_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.chao_race_intermediate_region) + connect(multiworld, player, names, LocationName.gate_3_region, LocationName.chao_race_expert_region) - connect(world, player, names, LocationName.gate_1_region, LocationName.kart_race_beginner_region) - connect(world, player, names, LocationName.gate_2_region, LocationName.kart_race_standard_region) - connect(world, player, names, LocationName.gate_3_region, LocationName.kart_race_expert_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_karate_beginner_region) + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.chao_karate_intermediate_region) + connect(multiworld, player, names, LocationName.gate_3_region, LocationName.chao_karate_expert_region) + connect(multiworld, player, names, LocationName.gate_4_region, LocationName.chao_karate_super_region) + + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.kart_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.kart_race_standard_region) + connect(multiworld, player, names, LocationName.gate_3_region, LocationName.kart_race_expert_region) + + if world.options.chao_kindergarten: + connect(multiworld, player, names, LocationName.gate_3_region, LocationName.chao_kindergarten_region) elif gates_len >= 6: - connect(world, player, names, LocationName.gate_1_region, LocationName.chao_garden_beginner_region) - connect(world, player, names, LocationName.gate_2_region, LocationName.chao_garden_intermediate_region) - connect(world, player, names, LocationName.gate_4_region, LocationName.chao_garden_expert_region) + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.chao_race_intermediate_region) + connect(multiworld, player, names, LocationName.gate_4_region, LocationName.chao_race_expert_region) + + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.chao_karate_beginner_region) + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.chao_karate_intermediate_region) + connect(multiworld, player, names, LocationName.gate_3_region, LocationName.chao_karate_expert_region) + connect(multiworld, player, names, LocationName.gate_4_region, LocationName.chao_karate_super_region) + + connect(multiworld, player, names, LocationName.gate_1_region, LocationName.kart_race_beginner_region) + connect(multiworld, player, names, LocationName.gate_2_region, LocationName.kart_race_standard_region) + connect(multiworld, player, names, LocationName.gate_4_region, LocationName.kart_race_expert_region) + + if world.options.chao_kindergarten: + connect(multiworld, player, names, LocationName.gate_3_region, LocationName.chao_kindergarten_region) + + stat_checks_per_gate = world.options.chao_stats.value / (gates_len) + for index in range(1, world.options.chao_stats.value + 1): + if (index % world.options.chao_stats_frequency.value) == (world.options.chao_stats.value % world.options.chao_stats_frequency.value): + gate_val = math.ceil(index / stat_checks_per_gate) - 1 + gate_region = multiworld.get_region("Gate " + str(gate_val), player) + + loc_name_swim = LocationName.chao_stat_swim_base + str(index) + loc_id_swim = chao_stat_swim_table[loc_name_swim] + location_swim = SA2BLocation(player, loc_name_swim, loc_id_swim, gate_region) + gate_region.locations.append(location_swim) + + loc_name_fly = LocationName.chao_stat_fly_base + str(index) + loc_id_fly = chao_stat_fly_table[loc_name_fly] + location_fly = SA2BLocation(player, loc_name_fly, loc_id_fly, gate_region) + gate_region.locations.append(location_fly) + + loc_name_run = LocationName.chao_stat_run_base + str(index) + loc_id_run = chao_stat_run_table[loc_name_run] + location_run = SA2BLocation(player, loc_name_run, loc_id_run, gate_region) + gate_region.locations.append(location_run) + + loc_name_power = LocationName.chao_stat_power_base + str(index) + loc_id_power = chao_stat_power_table[loc_name_power] + location_power = SA2BLocation(player, loc_name_power, loc_id_power, gate_region) + gate_region.locations.append(location_power) + + if world.options.chao_stats_stamina: + loc_name_stamina = LocationName.chao_stat_stamina_base + str(index) + loc_id_stamina = chao_stat_stamina_table[loc_name_stamina] + location_stamina = SA2BLocation(player, loc_name_stamina, loc_id_stamina, gate_region) + gate_region.locations.append(location_stamina) + + if world.options.chao_stats_hidden: + loc_name_luck = LocationName.chao_stat_luck_base + str(index) + loc_id_luck = chao_stat_luck_table[loc_name_luck] + location_luck = SA2BLocation(player, loc_name_luck, loc_id_luck, gate_region) + gate_region.locations.append(location_luck) + + loc_name_intelligence = LocationName.chao_stat_intelligence_base + str(index) + loc_id_intelligence = chao_stat_intelligence_table[loc_name_intelligence] + location_intelligence = SA2BLocation(player, loc_name_intelligence, loc_id_intelligence, gate_region) + gate_region.locations.append(location_intelligence) + + # Handle access to Animal Parts + if world.options.goal == 7 or world.options.chao_animal_parts: + connect(multiworld, player, names, LocationName.city_escape_region, LocationName.animal_rabbit) + connect(multiworld, player, names, LocationName.city_escape_region, LocationName.animal_skunk) + connect(multiworld, player, names, LocationName.city_escape_region, LocationName.animal_sheep) + connect(multiworld, player, names, LocationName.city_escape_region, LocationName.animal_raccoon) + + connect(multiworld, player, names, LocationName.wild_canyon_region, LocationName.animal_cheetah) + connect(multiworld, player, names, LocationName.wild_canyon_region, LocationName.animal_peacock) + connect(multiworld, player, names, LocationName.wild_canyon_region, LocationName.animal_condor) + connect(multiworld, player, names, LocationName.wild_canyon_region, LocationName.animal_sheep) + + connect(multiworld, player, names, LocationName.prison_lane_region, LocationName.animal_otter) + connect(multiworld, player, names, LocationName.prison_lane_region, LocationName.animal_tiger) + connect(multiworld, player, names, LocationName.prison_lane_region, LocationName.animal_gorilla) + connect(multiworld, player, names, LocationName.prison_lane_region, LocationName.animal_sheep) + connect(multiworld, player, names, LocationName.prison_lane_region, LocationName.animal_unicorn, + lambda state: (state.has(ItemName.tails_booster, player))) + + connect(multiworld, player, names, LocationName.metal_harbor_region, LocationName.animal_penguin) + connect(multiworld, player, names, LocationName.metal_harbor_region, LocationName.animal_seal) + connect(multiworld, player, names, LocationName.metal_harbor_region, LocationName.animal_peacock) + connect(multiworld, player, names, LocationName.metal_harbor_region, LocationName.animal_raccoon) + + connect(multiworld, player, names, LocationName.green_forest_region, LocationName.animal_rabbit) + connect(multiworld, player, names, LocationName.green_forest_region, LocationName.animal_cheetah) + connect(multiworld, player, names, LocationName.green_forest_region, LocationName.animal_parrot) + connect(multiworld, player, names, LocationName.green_forest_region, LocationName.animal_raccoon) + connect(multiworld, player, names, LocationName.green_forest_region, LocationName.animal_halffish) + + connect(multiworld, player, names, LocationName.pumpkin_hill_region, LocationName.animal_cheetah) + connect(multiworld, player, names, LocationName.pumpkin_hill_region, LocationName.animal_warthog) + connect(multiworld, player, names, LocationName.pumpkin_hill_region, LocationName.animal_skeleton_dog) + connect(multiworld, player, names, LocationName.pumpkin_hill_region, LocationName.animal_bat) + + connect(multiworld, player, names, LocationName.mission_street_region, LocationName.animal_rabbit) + connect(multiworld, player, names, LocationName.mission_street_region, LocationName.animal_warthog) + connect(multiworld, player, names, LocationName.mission_street_region, LocationName.animal_gorilla) + connect(multiworld, player, names, LocationName.mission_street_region, LocationName.animal_sheep) + + connect(multiworld, player, names, LocationName.aquatic_mine_region, LocationName.animal_penguin) + connect(multiworld, player, names, LocationName.aquatic_mine_region, LocationName.animal_seal) + connect(multiworld, player, names, LocationName.aquatic_mine_region, LocationName.animal_condor) + connect(multiworld, player, names, LocationName.aquatic_mine_region, LocationName.animal_skunk) + connect(multiworld, player, names, LocationName.aquatic_mine_region, LocationName.animal_dragon) + + connect(multiworld, player, names, LocationName.hidden_base_region, LocationName.animal_penguin, + lambda state: (state.has(ItemName.tails_booster, player))) + connect(multiworld, player, names, LocationName.hidden_base_region, LocationName.animal_otter, + lambda state: (state.has(ItemName.tails_booster, player))) + connect(multiworld, player, names, LocationName.hidden_base_region, LocationName.animal_tiger, + lambda state: (state.has(ItemName.tails_booster, player))) + connect(multiworld, player, names, LocationName.hidden_base_region, LocationName.animal_skunk) + connect(multiworld, player, names, LocationName.hidden_base_region, LocationName.animal_halffish, + lambda state: (state.has(ItemName.tails_booster, player))) + + connect(multiworld, player, names, LocationName.pyramid_cave_region, LocationName.animal_peacock) + connect(multiworld, player, names, LocationName.pyramid_cave_region, LocationName.animal_condor) + connect(multiworld, player, names, LocationName.pyramid_cave_region, LocationName.animal_sheep) + connect(multiworld, player, names, LocationName.pyramid_cave_region, LocationName.animal_bat) + + connect(multiworld, player, names, LocationName.death_chamber_region, LocationName.animal_rabbit) + connect(multiworld, player, names, LocationName.death_chamber_region, LocationName.animal_tiger) + connect(multiworld, player, names, LocationName.death_chamber_region, LocationName.animal_gorilla) + connect(multiworld, player, names, LocationName.death_chamber_region, LocationName.animal_skunk) + + connect(multiworld, player, names, LocationName.eternal_engine_region, LocationName.animal_warthog) + connect(multiworld, player, names, LocationName.eternal_engine_region, LocationName.animal_parrot, + lambda state: (state.has(ItemName.tails_booster, player))) + connect(multiworld, player, names, LocationName.eternal_engine_region, LocationName.animal_condor) + connect(multiworld, player, names, LocationName.eternal_engine_region, LocationName.animal_raccoon) + + connect(multiworld, player, names, LocationName.meteor_herd_region, LocationName.animal_penguin) + connect(multiworld, player, names, LocationName.meteor_herd_region, LocationName.animal_seal) + connect(multiworld, player, names, LocationName.meteor_herd_region, LocationName.animal_rabbit) + connect(multiworld, player, names, LocationName.meteor_herd_region, LocationName.animal_sheep) + connect(multiworld, player, names, LocationName.meteor_herd_region, LocationName.animal_phoenix) + + connect(multiworld, player, names, LocationName.crazy_gadget_region, LocationName.animal_seal) + connect(multiworld, player, names, LocationName.crazy_gadget_region, LocationName.animal_bear) + connect(multiworld, player, names, LocationName.crazy_gadget_region, LocationName.animal_tiger) + + connect(multiworld, player, names, LocationName.final_rush_region, LocationName.animal_penguin) + connect(multiworld, player, names, LocationName.final_rush_region, LocationName.animal_peacock) + connect(multiworld, player, names, LocationName.final_rush_region, LocationName.animal_condor) + connect(multiworld, player, names, LocationName.final_rush_region, LocationName.animal_sheep) + connect(multiworld, player, names, LocationName.final_rush_region, LocationName.animal_dragon, + lambda state: (state.has(ItemName.sonic_bounce_bracelet, player))) + + connect(multiworld, player, names, LocationName.iron_gate_region, LocationName.animal_rabbit) + connect(multiworld, player, names, LocationName.iron_gate_region, LocationName.animal_tiger) + connect(multiworld, player, names, LocationName.iron_gate_region, LocationName.animal_gorilla) + connect(multiworld, player, names, LocationName.iron_gate_region, LocationName.animal_skunk) + + connect(multiworld, player, names, LocationName.dry_lagoon_region, LocationName.animal_penguin) + connect(multiworld, player, names, LocationName.dry_lagoon_region, LocationName.animal_otter) + connect(multiworld, player, names, LocationName.dry_lagoon_region, LocationName.animal_peacock) + connect(multiworld, player, names, LocationName.dry_lagoon_region, LocationName.animal_sheep) + connect(multiworld, player, names, LocationName.dry_lagoon_region, LocationName.animal_unicorn) + + connect(multiworld, player, names, LocationName.sand_ocean_region, LocationName.animal_peacock) + connect(multiworld, player, names, LocationName.sand_ocean_region, LocationName.animal_parrot) + connect(multiworld, player, names, LocationName.sand_ocean_region, LocationName.animal_raccoon) + connect(multiworld, player, names, LocationName.sand_ocean_region, LocationName.animal_bat) + + connect(multiworld, player, names, LocationName.radical_highway_region, LocationName.animal_seal) + connect(multiworld, player, names, LocationName.radical_highway_region, LocationName.animal_cheetah) + connect(multiworld, player, names, LocationName.radical_highway_region, LocationName.animal_warthog) + connect(multiworld, player, names, LocationName.radical_highway_region, LocationName.animal_raccoon) + + connect(multiworld, player, names, LocationName.egg_quarters_region, LocationName.animal_bear) + connect(multiworld, player, names, LocationName.egg_quarters_region, LocationName.animal_gorilla) + connect(multiworld, player, names, LocationName.egg_quarters_region, LocationName.animal_parrot) + connect(multiworld, player, names, LocationName.egg_quarters_region, LocationName.animal_skunk) + connect(multiworld, player, names, LocationName.egg_quarters_region, LocationName.animal_halffish) + + connect(multiworld, player, names, LocationName.lost_colony_region, LocationName.animal_rabbit) + connect(multiworld, player, names, LocationName.lost_colony_region, LocationName.animal_warthog) + connect(multiworld, player, names, LocationName.lost_colony_region, LocationName.animal_bat) + + connect(multiworld, player, names, LocationName.weapons_bed_region, LocationName.animal_seal) + connect(multiworld, player, names, LocationName.weapons_bed_region, LocationName.animal_otter) + connect(multiworld, player, names, LocationName.weapons_bed_region, LocationName.animal_cheetah) + connect(multiworld, player, names, LocationName.weapons_bed_region, LocationName.animal_sheep) + + connect(multiworld, player, names, LocationName.security_hall_region, LocationName.animal_tiger) + connect(multiworld, player, names, LocationName.security_hall_region, LocationName.animal_parrot) + connect(multiworld, player, names, LocationName.security_hall_region, LocationName.animal_condor) + connect(multiworld, player, names, LocationName.security_hall_region, LocationName.animal_raccoon) + + connect(multiworld, player, names, LocationName.white_jungle_region, LocationName.animal_bear) + connect(multiworld, player, names, LocationName.white_jungle_region, LocationName.animal_peacock) + connect(multiworld, player, names, LocationName.white_jungle_region, LocationName.animal_parrot) + connect(multiworld, player, names, LocationName.white_jungle_region, LocationName.animal_skunk) + + connect(multiworld, player, names, LocationName.sky_rail_region, LocationName.animal_bear) + connect(multiworld, player, names, LocationName.sky_rail_region, LocationName.animal_tiger) + connect(multiworld, player, names, LocationName.sky_rail_region, LocationName.animal_condor) + connect(multiworld, player, names, LocationName.sky_rail_region, LocationName.animal_sheep) + + connect(multiworld, player, names, LocationName.mad_space_region, LocationName.animal_peacock) + connect(multiworld, player, names, LocationName.mad_space_region, LocationName.animal_parrot) + + connect(multiworld, player, names, LocationName.cosmic_wall_region, LocationName.animal_otter, + lambda state: (state.has(ItemName.eggman_jet_engine, player))) + connect(multiworld, player, names, LocationName.cosmic_wall_region, LocationName.animal_rabbit) + connect(multiworld, player, names, LocationName.cosmic_wall_region, LocationName.animal_cheetah, + lambda state: (state.has(ItemName.eggman_jet_engine, player))) + connect(multiworld, player, names, LocationName.cosmic_wall_region, LocationName.animal_sheep, + lambda state: (state.has(ItemName.eggman_jet_engine, player))) + connect(multiworld, player, names, LocationName.cosmic_wall_region, LocationName.animal_dragon, + lambda state: (state.has(ItemName.eggman_jet_engine, player))) + + connect(multiworld, player, names, LocationName.final_chase_region, LocationName.animal_penguin) + connect(multiworld, player, names, LocationName.final_chase_region, LocationName.animal_otter) + connect(multiworld, player, names, LocationName.final_chase_region, LocationName.animal_tiger) + connect(multiworld, player, names, LocationName.final_chase_region, LocationName.animal_skunk) + connect(multiworld, player, names, LocationName.final_chase_region, LocationName.animal_phoenix) + + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_seal) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_bear, + lambda state: (state.has(ItemName.tails_booster, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_gorilla) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_skunk) + + if world.options.goal in [1, 2]: + connect(multiworld, player, names, LocationName.green_hill_region, LocationName.animal_penguin) + connect(multiworld, player, names, LocationName.green_hill_region, LocationName.animal_otter) + connect(multiworld, player, names, LocationName.green_hill_region, LocationName.animal_gorilla) + connect(multiworld, player, names, LocationName.green_hill_region, LocationName.animal_raccoon) + connect(multiworld, player, names, LocationName.green_hill_region, LocationName.animal_unicorn) + + if world.options.logic_difficulty.value == 0: + connect(multiworld, player, names, LocationName.metal_harbor_region, LocationName.animal_phoenix, + lambda state: (state.has(ItemName.sonic_light_shoes, player))) + + connect(multiworld, player, names, LocationName.crazy_gadget_region, LocationName.animal_skunk, + lambda state: (state.has(ItemName.sonic_bounce_bracelet, player))) + connect(multiworld, player, names, LocationName.crazy_gadget_region, LocationName.animal_phoenix, + lambda state: (state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_flame_ring, player))) + + connect(multiworld, player, names, LocationName.weapons_bed_region, LocationName.animal_phoenix, + lambda state: (state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player))) + + connect(multiworld, player, names, LocationName.mad_space_region, LocationName.animal_gorilla, + lambda state: (state.has(ItemName.rouge_iron_boots, player))) + connect(multiworld, player, names, LocationName.mad_space_region, LocationName.animal_raccoon, + lambda state: (state.has(ItemName.rouge_iron_boots, player))) + connect(multiworld, player, names, LocationName.mad_space_region, LocationName.animal_halffish, + lambda state: (state.has(ItemName.rouge_iron_boots, player))) + + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_otter, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_rabbit, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.knuckles_air_necklace, player) and + state.has(ItemName.knuckles_hammer_gloves, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_cheetah, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_warthog, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_parrot, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.knuckles_air_necklace, player) and + state.has(ItemName.knuckles_hammer_gloves, player) and + (state.has(ItemName.sonic_bounce_bracelet, player) or + state.has(ItemName.sonic_flame_ring, player)))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_condor, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_raccoon, + lambda state: (state.has(ItemName.tails_booster, player) and + (state.has(ItemName.eggman_jet_engine, player) or + state.has(ItemName.eggman_large_cannon, player)))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_phoenix, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player))) + + elif world.options.logic_difficulty.value == 1: + connect(multiworld, player, names, LocationName.metal_harbor_region, LocationName.animal_phoenix) + + connect(multiworld, player, names, LocationName.crazy_gadget_region, LocationName.animal_skunk) + connect(multiworld, player, names, LocationName.crazy_gadget_region, LocationName.animal_phoenix, + lambda state: (state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_flame_ring, player))) + + connect(multiworld, player, names, LocationName.weapons_bed_region, LocationName.animal_phoenix, + lambda state: (state.has(ItemName.eggman_jet_engine, player))) + + connect(multiworld, player, names, LocationName.mad_space_region, LocationName.animal_gorilla) + connect(multiworld, player, names, LocationName.mad_space_region, LocationName.animal_raccoon) + connect(multiworld, player, names, LocationName.mad_space_region, LocationName.animal_halffish) + + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_otter, + lambda state: (state.has(ItemName.tails_booster, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_rabbit, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.knuckles_hammer_gloves, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_cheetah, + lambda state: (state.has(ItemName.tails_booster, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_warthog, + lambda state: (state.has(ItemName.tails_booster, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_parrot, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.knuckles_hammer_gloves, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_condor, + lambda state: (state.has(ItemName.tails_booster, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_raccoon, + lambda state: (state.has(ItemName.tails_booster, player))) + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_phoenix, + lambda state: (state.has(ItemName.tails_booster, player))) + + if world.options.keysanity: + connect(multiworld, player, names, LocationName.wild_canyon_region, LocationName.animal_dragon, + lambda state: (state.has(ItemName.knuckles_shovel_claws, player))) + + connect(multiworld, player, names, LocationName.mission_street_region, LocationName.animal_phoenix, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player))) + + connect(multiworld, player, names, LocationName.pyramid_cave_region, LocationName.animal_skeleton_dog, + lambda state: (state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_flame_ring, player))) + + connect(multiworld, player, names, LocationName.lost_colony_region, LocationName.animal_raccoon, + lambda state: (state.has(ItemName.eggman_jet_engine, player))) + + if world.options.logic_difficulty.value == 0: + connect(multiworld, player, names, LocationName.iron_gate_region, LocationName.animal_dragon, + lambda state: (state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player))) + + connect(multiworld, player, names, LocationName.sand_ocean_region, LocationName.animal_skeleton_dog, + lambda state: (state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.eggman_large_cannon, player))) + if world.options.logic_difficulty.value == 1: + connect(multiworld, player, names, LocationName.iron_gate_region, LocationName.animal_dragon, + lambda state: (state.has(ItemName.eggman_jet_engine, player))) + + connect(multiworld, player, names, LocationName.sand_ocean_region, LocationName.animal_skeleton_dog, + lambda state: (state.has(ItemName.eggman_jet_engine, player))) + + else: + connect(multiworld, player, names, LocationName.city_escape_region, LocationName.animal_unicorn) + + connect(multiworld, player, names, LocationName.wild_canyon_region, LocationName.animal_dragon) + + connect(multiworld, player, names, LocationName.pumpkin_hill_region, LocationName.animal_halffish) + + connect(multiworld, player, names, LocationName.mission_street_region, LocationName.animal_phoenix, + lambda state: (state.has(ItemName.tails_booster, player))) + + connect(multiworld, player, names, LocationName.death_chamber_region, LocationName.animal_skeleton_dog, + lambda state: (state.has(ItemName.knuckles_shovel_claws, player) and + state.has(ItemName.knuckles_hammer_gloves, player))) + + connect(multiworld, player, names, LocationName.eternal_engine_region, LocationName.animal_halffish, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.tails_bazooka, player))) + + connect(multiworld, player, names, LocationName.iron_gate_region, LocationName.animal_dragon) + + connect(multiworld, player, names, LocationName.sand_ocean_region, LocationName.animal_skeleton_dog) + + connect(multiworld, player, names, LocationName.radical_highway_region, LocationName.animal_unicorn) + + connect(multiworld, player, names, LocationName.lost_colony_region, LocationName.animal_raccoon) + connect(multiworld, player, names, LocationName.lost_colony_region, LocationName.animal_skeleton_dog) + + connect(multiworld, player, names, LocationName.security_hall_region, LocationName.animal_phoenix, + lambda state: (state.has(ItemName.rouge_pick_nails, player))) + + connect(multiworld, player, names, LocationName.sky_rail_region, LocationName.animal_phoenix) + + if world.options.logic_difficulty.value == 0: + connect(multiworld, player, names, LocationName.pyramid_cave_region, LocationName.animal_skeleton_dog, + lambda state: (state.has(ItemName.sonic_light_shoes, player) and + state.has(ItemName.sonic_bounce_bracelet, player) and + state.has(ItemName.sonic_mystic_melody, player))) + + connect(multiworld, player, names, LocationName.white_jungle_region, LocationName.animal_dragon, + lambda state: (state.has(ItemName.shadow_air_shoes, player))) + + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_dragon, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.eggman_jet_engine, player) and + state.has(ItemName.knuckles_air_necklace, player) and + state.has(ItemName.knuckles_hammer_gloves, player))) + elif world.options.logic_difficulty.value == 1: + connect(multiworld, player, names, LocationName.pyramid_cave_region, LocationName.animal_skeleton_dog) + + connect(multiworld, player, names, LocationName.white_jungle_region, LocationName.animal_dragon) + + connect(multiworld, player, names, LocationName.cannon_core_region, LocationName.animal_dragon, + lambda state: (state.has(ItemName.tails_booster, player) and + state.has(ItemName.knuckles_hammer_gloves, player))) - connect(world, player, names, LocationName.gate_1_region, LocationName.kart_race_beginner_region) - connect(world, player, names, LocationName.gate_2_region, LocationName.kart_race_standard_region) - connect(world, player, names, LocationName.gate_4_region, LocationName.kart_race_expert_region) + if world.options.black_market_slots.value > 0: + connect(multiworld, player, names, LocationName.gate_0_region, LocationName.black_market_region) -def create_region(world: MultiWorld, player: int, active_locations, name: str, locations=None): - ret = Region(name, player, world) +def create_region(multiworld: MultiWorld, player: int, active_locations, name: str, locations=None): + ret = Region(name, player, multiworld) if locations: for location in locations: loc_id = active_locations.get(location, 0) @@ -1708,10 +2437,10 @@ def create_region(world: MultiWorld, player: int, active_locations, name: str, l return ret -def connect(world: MultiWorld, player: int, used_names: typing.Dict[str, int], source: str, target: str, +def connect(multiworld: MultiWorld, player: int, used_names: typing.Dict[str, int], source: str, target: str, rule: typing.Optional[typing.Callable] = None): - source_region = world.get_region(source, player) - target_region = world.get_region(target, player) + source_region = multiworld.get_region(source, player) + target_region = multiworld.get_region(target, player) if target not in used_names: used_names[target] = 1 diff --git a/worlds/sa2b/Rules.py b/worlds/sa2b/Rules.py index 146938db7656..6b7ad69cd1a6 100644 --- a/worlds/sa2b/Rules.py +++ b/worlds/sa2b/Rules.py @@ -1,6 +1,7 @@ import typing from BaseClasses import MultiWorld +from worlds.AutoWorld import World from .Names import LocationName, ItemName from .Locations import boss_gate_set from worlds.AutoWorld import LogicMixin @@ -19,7 +20,7 @@ def add_rule_safe(multiworld: MultiWorld, spot_name: str, player: int, rule: Col add_rule(location, rule) -def set_mission_progress_rules(world: MultiWorld, player: int, mission_map: typing.Dict[int, int], mission_count_map: typing.Dict[int, int]): +def set_mission_progress_rules(multiworld: MultiWorld, player: int, mission_map: typing.Dict[int, int], mission_count_map: typing.Dict[int, int]): for i in range(31): mission_count = mission_count_map[i] mission_order: typing.List[int] = mission_orders[mission_map[i]] @@ -33,58 +34,58 @@ def set_mission_progress_rules(world: MultiWorld, player: int, mission_map: typi prev_mission_number = mission_order[j - 1] location_name: str = stage_prefix + str(mission_number) prev_location_name: str = stage_prefix + str(prev_mission_number) - set_rule(world.get_location(location_name, player), + set_rule(multiworld.get_location(location_name, player), lambda state, prev_location_name=prev_location_name: state.can_reach(prev_location_name, "Location", player)) -def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): +def set_mission_upgrade_rules_standard(multiworld: MultiWorld, world: World, player: int): # Mission 1 Upgrade Requirements - add_rule_safe(world, LocationName.metal_harbor_1, player, + add_rule_safe(multiworld, LocationName.metal_harbor_1, player, lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule_safe(world, LocationName.pumpkin_hill_1, player, + add_rule_safe(multiworld, LocationName.pumpkin_hill_1, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule_safe(world, LocationName.mission_street_1, player, + add_rule_safe(multiworld, LocationName.mission_street_1, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.aquatic_mine_1, player, + add_rule_safe(multiworld, LocationName.aquatic_mine_1, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule_safe(world, LocationName.hidden_base_1, player, + add_rule_safe(multiworld, LocationName.hidden_base_1, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.pyramid_cave_1, player, + add_rule_safe(multiworld, LocationName.pyramid_cave_1, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.death_chamber_1, player, + add_rule_safe(multiworld, LocationName.death_chamber_1, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule_safe(world, LocationName.eternal_engine_1, player, + add_rule_safe(multiworld, LocationName.eternal_engine_1, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule_safe(world, LocationName.meteor_herd_1, player, + add_rule_safe(multiworld, LocationName.meteor_herd_1, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule_safe(world, LocationName.crazy_gadget_1, player, + add_rule_safe(multiworld, LocationName.crazy_gadget_1, player, lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule_safe(world, LocationName.final_rush_1, player, + add_rule_safe(multiworld, LocationName.final_rush_1, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.egg_quarters_1, player, + add_rule_safe(multiworld, LocationName.egg_quarters_1, player, lambda state: state.has(ItemName.rouge_pick_nails, player)) - add_rule_safe(world, LocationName.lost_colony_1, player, + add_rule_safe(multiworld, LocationName.lost_colony_1, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.weapons_bed_1, player, + add_rule_safe(multiworld, LocationName.weapons_bed_1, player, lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.security_hall_1, player, + add_rule_safe(multiworld, LocationName.security_hall_1, player, lambda state: state.has(ItemName.rouge_pick_nails, player)) - add_rule_safe(world, LocationName.white_jungle_1, player, + add_rule_safe(multiworld, LocationName.white_jungle_1, player, lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule_safe(world, LocationName.mad_space_1, player, + add_rule_safe(multiworld, LocationName.mad_space_1, player, lambda state: state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule_safe(world, LocationName.cosmic_wall_1, player, + add_rule_safe(multiworld, LocationName.cosmic_wall_1, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.cannon_core_1, player, + add_rule_safe(multiworld, LocationName.cannon_core_1, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.knuckles_hammer_gloves, player) and @@ -92,129 +93,128 @@ def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): state.has(ItemName.sonic_bounce_bracelet, player)) # Mission 2 Upgrade Requirements - add_rule_safe(world, LocationName.metal_harbor_2, player, + add_rule_safe(multiworld, LocationName.metal_harbor_2, player, lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule_safe(world, LocationName.mission_street_2, player, + add_rule_safe(multiworld, LocationName.mission_street_2, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.hidden_base_2, player, + add_rule_safe(multiworld, LocationName.hidden_base_2, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.death_chamber_2, player, + add_rule_safe(multiworld, LocationName.death_chamber_2, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule_safe(world, LocationName.eternal_engine_2, player, - lambda state: state.has(ItemName.tails_booster, player) and - state.has(ItemName.tails_bazooka, player)) - add_rule_safe(world, LocationName.crazy_gadget_2, player, + add_rule_safe(multiworld, LocationName.eternal_engine_2, player, + lambda state: state.has(ItemName.tails_booster, player)) + add_rule_safe(multiworld, LocationName.crazy_gadget_2, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.lost_colony_2, player, + add_rule_safe(multiworld, LocationName.lost_colony_2, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.weapons_bed_2, player, + add_rule_safe(multiworld, LocationName.weapons_bed_2, player, lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.security_hall_2, player, + add_rule_safe(multiworld, LocationName.security_hall_2, player, lambda state: state.has(ItemName.rouge_pick_nails, player)) - add_rule_safe(world, LocationName.mad_space_2, player, + add_rule_safe(multiworld, LocationName.mad_space_2, player, lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule_safe(world, LocationName.cosmic_wall_2, player, + add_rule_safe(multiworld, LocationName.cosmic_wall_2, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.cannon_core_2, player, + add_rule_safe(multiworld, LocationName.cannon_core_2, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player)) # Mission 3 Upgrade Requirements - add_rule_safe(world, LocationName.city_escape_3, player, + add_rule_safe(multiworld, LocationName.city_escape_3, player, lambda state: state.has(ItemName.sonic_mystic_melody, player)) - add_rule_safe(world, LocationName.wild_canyon_3, player, + add_rule_safe(multiworld, LocationName.wild_canyon_3, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.knuckles_mystic_melody, player)) - add_rule_safe(world, LocationName.prison_lane_3, player, + add_rule_safe(multiworld, LocationName.prison_lane_3, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_mystic_melody, player)) - add_rule_safe(world, LocationName.metal_harbor_3, player, + add_rule_safe(multiworld, LocationName.metal_harbor_3, player, lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule_safe(world, LocationName.green_forest_3, player, + add_rule_safe(multiworld, LocationName.green_forest_3, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule_safe(world, LocationName.pumpkin_hill_3, player, + add_rule_safe(multiworld, LocationName.pumpkin_hill_3, player, lambda state: state.has(ItemName.knuckles_mystic_melody, player)) - add_rule_safe(world, LocationName.mission_street_3, player, + add_rule_safe(multiworld, LocationName.mission_street_3, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_mystic_melody, player)) - add_rule_safe(world, LocationName.aquatic_mine_3, player, + add_rule_safe(multiworld, LocationName.aquatic_mine_3, player, lambda state: state.has(ItemName.knuckles_mystic_melody, player)) - add_rule_safe(world, LocationName.hidden_base_3, player, + add_rule_safe(multiworld, LocationName.hidden_base_3, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_mystic_melody, player)) - add_rule_safe(world, LocationName.pyramid_cave_3, player, + add_rule_safe(multiworld, LocationName.pyramid_cave_3, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule_safe(world, LocationName.death_chamber_3, player, + add_rule_safe(multiworld, LocationName.death_chamber_3, player, lambda state: state.has(ItemName.knuckles_mystic_melody, player) and state.has(ItemName.knuckles_air_necklace, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule_safe(world, LocationName.eternal_engine_3, player, + add_rule_safe(multiworld, LocationName.eternal_engine_3, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_mystic_melody, player)) - add_rule_safe(world, LocationName.meteor_herd_3, player, + add_rule_safe(multiworld, LocationName.meteor_herd_3, player, lambda state: state.has(ItemName.knuckles_mystic_melody, player)) - add_rule_safe(world, LocationName.crazy_gadget_3, player, + add_rule_safe(multiworld, LocationName.crazy_gadget_3, player, lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule_safe(world, LocationName.final_rush_3, player, + add_rule_safe(multiworld, LocationName.final_rush_3, player, lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule_safe(world, LocationName.iron_gate_3, player, + add_rule_safe(multiworld, LocationName.iron_gate_3, player, lambda state: state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.dry_lagoon_3, player, + add_rule_safe(multiworld, LocationName.dry_lagoon_3, player, lambda state: state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule_safe(world, LocationName.sand_ocean_3, player, + add_rule_safe(multiworld, LocationName.sand_ocean_3, player, lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.radical_highway_3, player, + add_rule_safe(multiworld, LocationName.radical_highway_3, player, lambda state: state.has(ItemName.shadow_mystic_melody, player)) - add_rule_safe(world, LocationName.egg_quarters_3, player, + add_rule_safe(multiworld, LocationName.egg_quarters_3, player, lambda state: state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule_safe(world, LocationName.lost_colony_3, player, + add_rule_safe(multiworld, LocationName.lost_colony_3, player, lambda state: state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.weapons_bed_3, player, + add_rule_safe(multiworld, LocationName.weapons_bed_3, player, lambda state: state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.security_hall_3, player, + add_rule_safe(multiworld, LocationName.security_hall_3, player, lambda state: state.has(ItemName.rouge_treasure_scope, player)) - add_rule_safe(world, LocationName.white_jungle_3, player, + add_rule_safe(multiworld, LocationName.white_jungle_3, player, lambda state: state.has(ItemName.shadow_air_shoes, player) and state.has(ItemName.shadow_mystic_melody, player)) - add_rule_safe(world, LocationName.sky_rail_3, player, + add_rule_safe(multiworld, LocationName.sky_rail_3, player, lambda state: state.has(ItemName.shadow_air_shoes, player) and state.has(ItemName.shadow_mystic_melody, player)) - add_rule_safe(world, LocationName.mad_space_3, player, + add_rule_safe(multiworld, LocationName.mad_space_3, player, lambda state: state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule_safe(world, LocationName.cosmic_wall_3, player, + add_rule_safe(multiworld, LocationName.cosmic_wall_3, player, lambda state: state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.final_chase_3, player, + add_rule_safe(multiworld, LocationName.final_chase_3, player, lambda state: state.has(ItemName.shadow_air_shoes, player) and state.has(ItemName.shadow_mystic_melody, player)) - add_rule_safe(world, LocationName.cannon_core_3, player, + add_rule_safe(multiworld, LocationName.cannon_core_3, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player) and @@ -227,52 +227,52 @@ def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): state.has(ItemName.sonic_light_shoes, player)) # Mission 4 Upgrade Requirements - add_rule_safe(world, LocationName.metal_harbor_4, player, + add_rule_safe(multiworld, LocationName.metal_harbor_4, player, lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule_safe(world, LocationName.pumpkin_hill_4, player, + add_rule_safe(multiworld, LocationName.pumpkin_hill_4, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule_safe(world, LocationName.mission_street_4, player, + add_rule_safe(multiworld, LocationName.mission_street_4, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.aquatic_mine_4, player, + add_rule_safe(multiworld, LocationName.aquatic_mine_4, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule_safe(world, LocationName.hidden_base_4, player, + add_rule_safe(multiworld, LocationName.hidden_base_4, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.pyramid_cave_4, player, + add_rule_safe(multiworld, LocationName.pyramid_cave_4, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.death_chamber_4, player, + add_rule_safe(multiworld, LocationName.death_chamber_4, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule_safe(world, LocationName.eternal_engine_4, player, + add_rule_safe(multiworld, LocationName.eternal_engine_4, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule_safe(world, LocationName.meteor_herd_4, player, + add_rule_safe(multiworld, LocationName.meteor_herd_4, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule_safe(world, LocationName.crazy_gadget_4, player, + add_rule_safe(multiworld, LocationName.crazy_gadget_4, player, lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule_safe(world, LocationName.final_rush_4, player, + add_rule_safe(multiworld, LocationName.final_rush_4, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.egg_quarters_4, player, + add_rule_safe(multiworld, LocationName.egg_quarters_4, player, lambda state: state.has(ItemName.rouge_pick_nails, player)) - add_rule_safe(world, LocationName.lost_colony_4, player, + add_rule_safe(multiworld, LocationName.lost_colony_4, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.weapons_bed_4, player, + add_rule_safe(multiworld, LocationName.weapons_bed_4, player, lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.security_hall_4, player, + add_rule_safe(multiworld, LocationName.security_hall_4, player, lambda state: state.has(ItemName.rouge_pick_nails, player)) - add_rule_safe(world, LocationName.white_jungle_4, player, + add_rule_safe(multiworld, LocationName.white_jungle_4, player, lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule_safe(world, LocationName.mad_space_4, player, + add_rule_safe(multiworld, LocationName.mad_space_4, player, lambda state: state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule_safe(world, LocationName.cosmic_wall_4, player, + add_rule_safe(multiworld, LocationName.cosmic_wall_4, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.cannon_core_4, player, + add_rule_safe(multiworld, LocationName.cannon_core_4, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.knuckles_hammer_gloves, player) and @@ -280,76 +280,76 @@ def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): state.has(ItemName.sonic_bounce_bracelet, player)) # Mission 5 Upgrade Requirements - add_rule_safe(world, LocationName.city_escape_5, player, + add_rule_safe(multiworld, LocationName.city_escape_5, player, lambda state: state.has(ItemName.sonic_flame_ring, player) and state.has(ItemName.sonic_light_shoes, player)) - add_rule_safe(world, LocationName.wild_canyon_5, player, + add_rule_safe(multiworld, LocationName.wild_canyon_5, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_sunglasses, player)) - add_rule_safe(world, LocationName.metal_harbor_5, player, + add_rule_safe(multiworld, LocationName.metal_harbor_5, player, lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule_safe(world, LocationName.green_forest_5, player, + add_rule_safe(multiworld, LocationName.green_forest_5, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.pumpkin_hill_5, player, + add_rule_safe(multiworld, LocationName.pumpkin_hill_5, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_sunglasses, player)) - add_rule_safe(world, LocationName.mission_street_5, player, + add_rule_safe(multiworld, LocationName.mission_street_5, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule_safe(world, LocationName.aquatic_mine_5, player, + add_rule_safe(multiworld, LocationName.aquatic_mine_5, player, lambda state: state.has(ItemName.knuckles_mystic_melody, player) and state.has(ItemName.knuckles_air_necklace, player) and state.has(ItemName.knuckles_sunglasses, player)) - add_rule_safe(world, LocationName.hidden_base_5, player, + add_rule_safe(multiworld, LocationName.hidden_base_5, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.pyramid_cave_5, player, + add_rule_safe(multiworld, LocationName.pyramid_cave_5, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.death_chamber_5, player, + add_rule_safe(multiworld, LocationName.death_chamber_5, player, lambda state: state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_mystic_melody, player) and state.has(ItemName.knuckles_air_necklace, player)) - add_rule_safe(world, LocationName.eternal_engine_5, player, + add_rule_safe(multiworld, LocationName.eternal_engine_5, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule_safe(world, LocationName.meteor_herd_5, player, + add_rule_safe(multiworld, LocationName.meteor_herd_5, player, lambda state: state.has(ItemName.knuckles_sunglasses, player)) - add_rule_safe(world, LocationName.crazy_gadget_5, player, + add_rule_safe(multiworld, LocationName.crazy_gadget_5, player, lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule_safe(world, LocationName.final_rush_5, player, + add_rule_safe(multiworld, LocationName.final_rush_5, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.iron_gate_5, player, + add_rule_safe(multiworld, LocationName.iron_gate_5, player, lambda state: state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.dry_lagoon_5, player, + add_rule_safe(multiworld, LocationName.dry_lagoon_5, player, lambda state: state.has(ItemName.rouge_treasure_scope, player)) - add_rule_safe(world, LocationName.sand_ocean_5, player, + add_rule_safe(multiworld, LocationName.sand_ocean_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.egg_quarters_5, player, + add_rule_safe(multiworld, LocationName.egg_quarters_5, player, lambda state: state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_treasure_scope, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule_safe(world, LocationName.lost_colony_5, player, + add_rule_safe(multiworld, LocationName.lost_colony_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.weapons_bed_5, player, + add_rule_safe(multiworld, LocationName.weapons_bed_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.security_hall_5, player, + add_rule_safe(multiworld, LocationName.security_hall_5, player, lambda state: state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_treasure_scope, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule_safe(world, LocationName.white_jungle_5, player, + add_rule_safe(multiworld, LocationName.white_jungle_5, player, lambda state: state.has(ItemName.shadow_air_shoes, player) and state.has(ItemName.shadow_flame_ring, player)) - add_rule_safe(world, LocationName.mad_space_5, player, + add_rule_safe(multiworld, LocationName.mad_space_5, player, lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule_safe(world, LocationName.cosmic_wall_5, player, + add_rule_safe(multiworld, LocationName.cosmic_wall_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.cannon_core_5, player, + add_rule_safe(multiworld, LocationName.cannon_core_5, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.knuckles_mystic_melody, player) and @@ -358,132 +358,132 @@ def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): state.has(ItemName.sonic_bounce_bracelet, player)) # Upgrade Spot Upgrade Requirements - add_rule(world.get_location(LocationName.city_escape_upgrade, player), + add_rule(multiworld.get_location(LocationName.city_escape_upgrade, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.wild_canyon_upgrade, player), + add_rule(multiworld.get_location(LocationName.wild_canyon_upgrade, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule(world.get_location(LocationName.prison_lane_upgrade, player), + add_rule(multiworld.get_location(LocationName.prison_lane_upgrade, player), lambda state: state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.hidden_base_upgrade, player), + add_rule(multiworld.get_location(LocationName.hidden_base_upgrade, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.eternal_engine_upgrade, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_upgrade, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.meteor_herd_upgrade, player), + add_rule(multiworld.get_location(LocationName.meteor_herd_upgrade, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.crazy_gadget_upgrade, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_upgrade, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.final_rush_upgrade, player), + add_rule(multiworld.get_location(LocationName.final_rush_upgrade, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.iron_gate_upgrade, player), + add_rule(multiworld.get_location(LocationName.iron_gate_upgrade, player), lambda state: state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.dry_lagoon_upgrade, player), + add_rule(multiworld.get_location(LocationName.dry_lagoon_upgrade, player), lambda state: state.has(ItemName.rouge_pick_nails, player)) - add_rule(world.get_location(LocationName.sand_ocean_upgrade, player), + add_rule(multiworld.get_location(LocationName.sand_ocean_upgrade, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.radical_highway_upgrade, player), + add_rule(multiworld.get_location(LocationName.radical_highway_upgrade, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.security_hall_upgrade, player), + add_rule(multiworld.get_location(LocationName.security_hall_upgrade, player), lambda state: state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_upgrade, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_upgrade, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) # Chao Key Upgrade Requirements - if world.keysanity[player]: - add_rule(world.get_location(LocationName.prison_lane_chao_1, player), + if world.options.keysanity: + add_rule(multiworld.get_location(LocationName.prison_lane_chao_1, player), lambda state: state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.mission_street_chao_1, player), + add_rule(multiworld.get_location(LocationName.mission_street_chao_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_chao_1, player), + add_rule(multiworld.get_location(LocationName.hidden_base_chao_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_chao_1, player), + add_rule(multiworld.get_location(LocationName.death_chamber_chao_1, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_chao_1, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_chao_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_chao_1, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_chao_1, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.cosmic_wall_chao_1, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_chao_1, player), lambda state: state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_chao_1, player), + add_rule(multiworld.get_location(LocationName.cannon_core_chao_1, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.prison_lane_chao_2, player), + add_rule(multiworld.get_location(LocationName.prison_lane_chao_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.metal_harbor_chao_2, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_chao_2, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_chao_2, player), + add_rule(multiworld.get_location(LocationName.mission_street_chao_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_chao_2, player), + add_rule(multiworld.get_location(LocationName.hidden_base_chao_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_chao_2, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_chao_2, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.death_chamber_chao_2, player), + add_rule(multiworld.get_location(LocationName.death_chamber_chao_2, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_chao_2, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_chao_2, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_chao_2, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_chao_2, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.weapons_bed_chao_2, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_chao_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.white_jungle_chao_2, player), + add_rule(multiworld.get_location(LocationName.white_jungle_chao_2, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.mad_space_chao_2, player), + add_rule(multiworld.get_location(LocationName.mad_space_chao_2, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_chao_2, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_chao_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_chao_2, player), + add_rule(multiworld.get_location(LocationName.cannon_core_chao_2, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.metal_harbor_chao_3, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_chao_3, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_chao_3, player), + add_rule(multiworld.get_location(LocationName.mission_street_chao_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_chao_3, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_chao_3, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule(world.get_location(LocationName.death_chamber_chao_3, player), + add_rule(multiworld.get_location(LocationName.death_chamber_chao_3, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_chao_3, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_chao_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_chao_3, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_chao_3, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.final_rush_chao_3, player), + add_rule(multiworld.get_location(LocationName.final_rush_chao_3, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.egg_quarters_chao_3, player), + add_rule(multiworld.get_location(LocationName.egg_quarters_chao_3, player), lambda state: state.has(ItemName.rouge_mystic_melody, player)) - add_rule(world.get_location(LocationName.lost_colony_chao_3, player), + add_rule(multiworld.get_location(LocationName.lost_colony_chao_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_chao_3, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_chao_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.security_hall_chao_3, player), + add_rule(multiworld.get_location(LocationName.security_hall_chao_3, player), lambda state: state.has(ItemName.rouge_pick_nails, player)) - add_rule(world.get_location(LocationName.white_jungle_chao_3, player), + add_rule(multiworld.get_location(LocationName.white_jungle_chao_3, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.mad_space_chao_3, player), + add_rule(multiworld.get_location(LocationName.mad_space_chao_3, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_chao_3, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_chao_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_chao_3, player), + add_rule(multiworld.get_location(LocationName.cannon_core_chao_3, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.knuckles_hammer_gloves, player) and @@ -491,804 +491,807 @@ def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): state.has(ItemName.sonic_flame_ring, player)) # Pipe Upgrade Requirements - if world.whistlesanity[player].value == 1 or world.whistlesanity[player].value == 3: - add_rule(world.get_location(LocationName.mission_street_pipe_1, player), + if world.options.whistlesanity.value == 1 or world.options.whistlesanity.value == 3: + add_rule(multiworld.get_location(LocationName.mission_street_pipe_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_pipe_1, player), + add_rule(multiworld.get_location(LocationName.hidden_base_pipe_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.sand_ocean_pipe_1, player), + add_rule(multiworld.get_location(LocationName.sand_ocean_pipe_1, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_pipe_1, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_pipe_1, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.mission_street_pipe_2, player), + add_rule(multiworld.get_location(LocationName.cannon_core_pipe_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_pipe_2, player), + + add_rule(multiworld.get_location(LocationName.mission_street_pipe_2, player), + lambda state: state.has(ItemName.tails_booster, player)) + add_rule(multiworld.get_location(LocationName.hidden_base_pipe_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_pipe_2, player), + add_rule(multiworld.get_location(LocationName.death_chamber_pipe_2, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_pipe_2, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_pipe_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_pipe_2, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_pipe_2, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.sand_ocean_pipe_2, player), + add_rule(multiworld.get_location(LocationName.sand_ocean_pipe_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.lost_colony_pipe_2, player), + add_rule(multiworld.get_location(LocationName.lost_colony_pipe_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_pipe_2, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_pipe_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_pipe_2, player), + add_rule(multiworld.get_location(LocationName.cannon_core_pipe_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.prison_lane_pipe_3, player), + add_rule(multiworld.get_location(LocationName.prison_lane_pipe_3, player), lambda state: state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.mission_street_pipe_3, player), + add_rule(multiworld.get_location(LocationName.mission_street_pipe_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_pipe_3, player), + add_rule(multiworld.get_location(LocationName.hidden_base_pipe_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_pipe_3, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_pipe_3, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.death_chamber_pipe_3, player), + add_rule(multiworld.get_location(LocationName.death_chamber_pipe_3, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_pipe_3, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_pipe_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_pipe_3, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_pipe_3, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule(world.get_location(LocationName.weapons_bed_pipe_3, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_pipe_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.white_jungle_pipe_3, player), + add_rule(multiworld.get_location(LocationName.white_jungle_pipe_3, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.mad_space_pipe_3, player), + add_rule(multiworld.get_location(LocationName.mad_space_pipe_3, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_pipe_3, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_pipe_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_pipe_3, player), + add_rule(multiworld.get_location(LocationName.cannon_core_pipe_3, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.hidden_base_pipe_4, player), + add_rule(multiworld.get_location(LocationName.hidden_base_pipe_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_pipe_4, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_pipe_4, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.eternal_engine_pipe_4, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_pipe_4, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_pipe_4, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_pipe_4, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.weapons_bed_pipe_4, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_pipe_4, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.white_jungle_pipe_4, player), + add_rule(multiworld.get_location(LocationName.white_jungle_pipe_4, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.mad_space_pipe_4, player), + add_rule(multiworld.get_location(LocationName.mad_space_pipe_4, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_pipe_4, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_pipe_4, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_pipe_4, player), + add_rule(multiworld.get_location(LocationName.cannon_core_pipe_4, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.hidden_base_pipe_5, player), + add_rule(multiworld.get_location(LocationName.hidden_base_pipe_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.eternal_engine_pipe_5, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_pipe_5, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.weapons_bed_pipe_5, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_pipe_5, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.cosmic_wall_pipe_5, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_pipe_5, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_pipe_5, player), + add_rule(multiworld.get_location(LocationName.cannon_core_pipe_5, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.knuckles_air_necklace, player)) # Hidden Whistle Upgrade Requirements - if world.whistlesanity[player].value == 2 or world.whistlesanity[player].value == 3: - add_rule(world.get_location(LocationName.mission_street_hidden_3, player), + if world.options.whistlesanity.value == 2 or world.options.whistlesanity.value == 3: + add_rule(multiworld.get_location(LocationName.mission_street_hidden_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.mission_street_hidden_4, player), + add_rule(multiworld.get_location(LocationName.mission_street_hidden_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_hidden_1, player), + add_rule(multiworld.get_location(LocationName.death_chamber_hidden_1, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.death_chamber_hidden_2, player), + add_rule(multiworld.get_location(LocationName.death_chamber_hidden_2, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.crazy_gadget_hidden_1, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_hidden_1, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.white_jungle_hidden_3, player), + add_rule(multiworld.get_location(LocationName.white_jungle_hidden_3, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.cannon_core_hidden_1, player), + add_rule(multiworld.get_location(LocationName.cannon_core_hidden_1, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player)) # Omochao Upgrade Requirements - if world.omosanity[player]: - add_rule(world.get_location(LocationName.eternal_engine_omo_1, player), + if world.options.omosanity: + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_omo_2, player), + add_rule(multiworld.get_location(LocationName.hidden_base_omo_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_omo_2, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_omo_2, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_2, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_2, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_2, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.radical_highway_omo_2, player), + add_rule(multiworld.get_location(LocationName.radical_highway_omo_2, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.weapons_bed_omo_2, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_omo_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.mission_street_omo_3, player), + add_rule(multiworld.get_location(LocationName.mission_street_omo_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_omo_3, player), + add_rule(multiworld.get_location(LocationName.hidden_base_omo_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_omo_3, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_omo_3, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_3, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.final_rush_omo_3, player), + add_rule(multiworld.get_location(LocationName.final_rush_omo_3, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.weapons_bed_omo_3, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_omo_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.metal_harbor_omo_4, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_omo_4, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_omo_4, player), + add_rule(multiworld.get_location(LocationName.mission_street_omo_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_omo_4, player), + add_rule(multiworld.get_location(LocationName.hidden_base_omo_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_omo_4, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_omo_4, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_4, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_4, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_4, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.mad_space_omo_4, player), + add_rule(multiworld.get_location(LocationName.mad_space_omo_4, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_4, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.metal_harbor_omo_5, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_omo_5, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_omo_5, player), + add_rule(multiworld.get_location(LocationName.mission_street_omo_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_5, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_5, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_5, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_omo_5, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_omo_5, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.white_jungle_omo_5, player), + add_rule(multiworld.get_location(LocationName.white_jungle_omo_5, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.mad_space_omo_5, player), + add_rule(multiworld.get_location(LocationName.mad_space_omo_5, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_5, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_5, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.mission_street_omo_6, player), + add_rule(multiworld.get_location(LocationName.mission_street_omo_6, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_6, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_6, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_6, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_6, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_omo_6, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_omo_6, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.lost_colony_omo_6, player), + add_rule(multiworld.get_location(LocationName.lost_colony_omo_6, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_6, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_6, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.mission_street_omo_7, player), + add_rule(multiworld.get_location(LocationName.mission_street_omo_7, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_7, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_7, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_7, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_7, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_omo_7, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_omo_7, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.lost_colony_omo_7, player), + add_rule(multiworld.get_location(LocationName.lost_colony_omo_7, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_7, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_7, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.knuckles_air_necklace, player)) - add_rule(world.get_location(LocationName.mission_street_omo_8, player), + add_rule(multiworld.get_location(LocationName.mission_street_omo_8, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_8, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_8, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_8, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_8, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_omo_8, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_omo_8, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.lost_colony_omo_8, player), + add_rule(multiworld.get_location(LocationName.lost_colony_omo_8, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.security_hall_omo_8, player), + add_rule(multiworld.get_location(LocationName.security_hall_omo_8, player), lambda state: state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_8, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_8, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.knuckles_air_necklace, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_9, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_9, player), lambda state: state.has(ItemName.knuckles_mystic_melody, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_9, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_9, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_omo_9, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_omo_9, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_9, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_9, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.knuckles_air_necklace, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_10, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_10, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_omo_10, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_omo_10, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_11, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_11, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_omo_11, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_omo_11, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_12, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_12, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_omo_12, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_omo_12, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.crazy_gadget_omo_13, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_omo_13, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) # Gold Beetle Upgrade Requirements - if world.beetlesanity[player]: - add_rule(world.get_location(LocationName.mission_street_beetle, player), + if world.options.beetlesanity: + add_rule(multiworld.get_location(LocationName.mission_street_beetle, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_beetle, player), + add_rule(multiworld.get_location(LocationName.hidden_base_beetle, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_beetle, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_beetle, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.death_chamber_beetle, player), + add_rule(multiworld.get_location(LocationName.death_chamber_beetle, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_beetle, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_beetle, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_beetle, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_beetle, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.dry_lagoon_beetle, player), + add_rule(multiworld.get_location(LocationName.dry_lagoon_beetle, player), lambda state: state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.lost_colony_beetle, player), + add_rule(multiworld.get_location(LocationName.lost_colony_beetle, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.white_jungle_beetle, player), + add_rule(multiworld.get_location(LocationName.white_jungle_beetle, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.mad_space_beetle, player), + add_rule(multiworld.get_location(LocationName.mad_space_beetle, player), lambda state: state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_beetle, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_beetle, player), lambda state: state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_beetle, player), + add_rule(multiworld.get_location(LocationName.cannon_core_beetle, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.knuckles_air_necklace, player)) # Animal Upgrade Requirements - if world.animalsanity[player]: - add_rule(world.get_location(LocationName.hidden_base_animal_2, player), + if world.options.animalsanity: + add_rule(multiworld.get_location(LocationName.hidden_base_animal_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_2, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_3, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_3, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_3, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_3, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_3, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_3, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_3, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_3, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_4, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_4, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_4, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_4, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_4, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_4, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_4, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_4, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.mad_space_animal_4, player), + add_rule(multiworld.get_location(LocationName.mad_space_animal_4, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_4, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_4, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_4, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.mission_street_animal_5, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_5, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_5, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_5, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_5, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_5, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_5, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_5, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_5, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.mad_space_animal_5, player), + add_rule(multiworld.get_location(LocationName.mad_space_animal_5, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_5, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_5, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_5, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_5, player), lambda state: state.has(ItemName.tails_booster, player) and (state.has(ItemName.eggman_jet_engine, player) or state.has(ItemName.eggman_large_cannon, player))) - add_rule(world.get_location(LocationName.metal_harbor_animal_6, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_animal_6, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_animal_6, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_6, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_6, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_6, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_6, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_6, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_6, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_6, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_6, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_6, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_6, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_6, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_6, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_6, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.mad_space_animal_6, player), + add_rule(multiworld.get_location(LocationName.mad_space_animal_6, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_6, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_6, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_6, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_6, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.metal_harbor_animal_7, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_animal_7, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_animal_7, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_7, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_7, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_7, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_7, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_7, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_7, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_7, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_7, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_7, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_7, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_7, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_7, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_7, player), lambda state: state.has(ItemName.eggman_jet_engine, player) or state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_7, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_7, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.security_hall_animal_7, player), + add_rule(multiworld.get_location(LocationName.security_hall_animal_7, player), lambda state: state.has(ItemName.rouge_pick_nails, player) or state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.mad_space_animal_7, player), + add_rule(multiworld.get_location(LocationName.mad_space_animal_7, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_7, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_7, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_7, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_7, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.metal_harbor_animal_8, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_animal_8, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_animal_8, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_8, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_8, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_8, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_8, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_8, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_8, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_8, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_8, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_8, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_8, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_8, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_8, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_8, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_8, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_8, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.security_hall_animal_8, player), + add_rule(multiworld.get_location(LocationName.security_hall_animal_8, player), lambda state: state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.mad_space_animal_8, player), + add_rule(multiworld.get_location(LocationName.mad_space_animal_8, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_8, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_8, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_8, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_8, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.metal_harbor_animal_9, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_animal_9, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_animal_9, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_9, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_9, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_9, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_9, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_9, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_9, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_9, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_9, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_9, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_9, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_9, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.final_rush_animal_9, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_9, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_9, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_9, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_9, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_9, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.mad_space_animal_9, player), + add_rule(multiworld.get_location(LocationName.mad_space_animal_9, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_9, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_9, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_9, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_9, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.wild_canyon_animal_10, player), + add_rule(multiworld.get_location(LocationName.wild_canyon_animal_10, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule(world.get_location(LocationName.metal_harbor_animal_10, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_animal_10, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_animal_10, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_10, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.aquatic_mine_animal_10, player), + add_rule(multiworld.get_location(LocationName.aquatic_mine_animal_10, player), lambda state: state.has(ItemName.knuckles_mystic_melody, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_10, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_10, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_10, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_10, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_10, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_10, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_10, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_10, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_10, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_10, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.final_rush_animal_10, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_10, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.egg_quarters_animal_10, player), + add_rule(multiworld.get_location(LocationName.egg_quarters_animal_10, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_10, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_10, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_10, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_10, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.mad_space_animal_10, player), + add_rule(multiworld.get_location(LocationName.mad_space_animal_10, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_10, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_10, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_10, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_10, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.metal_harbor_animal_11, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_animal_11, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_animal_11, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_11, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_11, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_11, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_11, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_11, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_11, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_11, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_11, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_11, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and (state.has(ItemName.sonic_flame_ring, player) or state.has(ItemName.sonic_mystic_melody, player))) - add_rule(world.get_location(LocationName.final_rush_animal_11, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_11, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_11, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_11, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_11, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_11, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.white_jungle_animal_11, player), + add_rule(multiworld.get_location(LocationName.white_jungle_animal_11, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_11, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_11, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_11, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_11, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.metal_harbor_animal_12, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_animal_12, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_animal_12, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_12, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_12, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_12, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_12, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_12, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_12, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_12, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_12, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_12, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player) and (state.has(ItemName.sonic_light_shoes, player) or state.has(ItemName.sonic_mystic_melody, player))) - add_rule(world.get_location(LocationName.final_rush_animal_12, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_12, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.sand_ocean_animal_12, player), + add_rule(multiworld.get_location(LocationName.sand_ocean_animal_12, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_12, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_12, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_12, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_12, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.white_jungle_animal_12, player), + add_rule(multiworld.get_location(LocationName.white_jungle_animal_12, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_12, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_12, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_12, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_12, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.prison_lane_animal_13, player), + add_rule(multiworld.get_location(LocationName.prison_lane_animal_13, player), lambda state: state.has(ItemName.tails_booster, player) or state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.metal_harbor_animal_13, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_animal_13, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_animal_13, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_13, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_13, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_13, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_13, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_13, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_13, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_13, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_13, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_13, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.final_rush_animal_13, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_13, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.sand_ocean_animal_13, player), + add_rule(multiworld.get_location(LocationName.sand_ocean_animal_13, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_13, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_13, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_13, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_13, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.white_jungle_animal_13, player), + add_rule(multiworld.get_location(LocationName.white_jungle_animal_13, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_13, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_13, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_13, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_13, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player) and (state.has(ItemName.knuckles_air_necklace, player) or state.has(ItemName.knuckles_hammer_gloves, player))) - add_rule(world.get_location(LocationName.prison_lane_animal_14, player), + add_rule(multiworld.get_location(LocationName.prison_lane_animal_14, player), lambda state: state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.metal_harbor_animal_14, player), + add_rule(multiworld.get_location(LocationName.metal_harbor_animal_14, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) - add_rule(world.get_location(LocationName.mission_street_animal_14, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_14, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_14, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_14, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_14, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_14, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_14, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_14, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_14, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_14, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.final_rush_animal_14, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_14, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.sand_ocean_animal_14, player), + add_rule(multiworld.get_location(LocationName.sand_ocean_animal_14, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_14, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_14, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_14, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_14, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.white_jungle_animal_14, player), + add_rule(multiworld.get_location(LocationName.white_jungle_animal_14, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_14, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_14, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_14, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_14, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player) and state.has(ItemName.knuckles_air_necklace, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.prison_lane_animal_15, player), + add_rule(multiworld.get_location(LocationName.prison_lane_animal_15, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.mission_street_animal_15, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_15, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_15, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_15, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_15, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_15, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_15, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_15, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_15, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_15, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.final_rush_animal_15, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_15, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.iron_gate_animal_15, player), + add_rule(multiworld.get_location(LocationName.iron_gate_animal_15, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.sand_ocean_animal_15, player), + add_rule(multiworld.get_location(LocationName.sand_ocean_animal_15, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_15, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_15, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.white_jungle_animal_15, player), + add_rule(multiworld.get_location(LocationName.white_jungle_animal_15, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_15, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_15, player), lambda state: state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_15, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_15, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player) and state.has(ItemName.knuckles_air_necklace, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.mission_street_animal_16, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_16, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_16, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_16, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and (state.has(ItemName.sonic_flame_ring, player) or (state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_mystic_melody, player)))) - add_rule(world.get_location(LocationName.crazy_gadget_animal_16, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_16, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule(world.get_location(LocationName.final_rush_animal_16, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_16, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.white_jungle_animal_16, player), + add_rule(multiworld.get_location(LocationName.white_jungle_animal_16, player), lambda state: state.has(ItemName.shadow_flame_ring, player) and state.has(ItemName.shadow_air_shoes, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_16, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_16, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player) and state.has(ItemName.knuckles_air_necklace, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_17, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_17, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule(world.get_location(LocationName.final_chase_animal_17, player), + add_rule(multiworld.get_location(LocationName.final_chase_animal_17, player), lambda state: state.has(ItemName.shadow_flame_ring, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_17, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_17, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player) and @@ -1297,12 +1300,12 @@ def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): (state.has(ItemName.sonic_bounce_bracelet, player) or state.has(ItemName.sonic_flame_ring, player))) - add_rule(world.get_location(LocationName.pyramid_cave_animal_18, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_18, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_18, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_18, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player) and @@ -1310,12 +1313,12 @@ def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_19, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_19, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_19, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_19, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player) and @@ -1324,897 +1327,901 @@ def set_mission_upgrade_rules_standard(world: MultiWorld, player: int): state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.radical_highway_animal_20, player), + add_rule(multiworld.get_location(LocationName.radical_highway_animal_20, player), lambda state: state.has(ItemName.shadow_flame_ring, player)) -def set_mission_upgrade_rules_hard(world: MultiWorld, player: int): +def set_mission_upgrade_rules_hard(multiworld: MultiWorld, world: World, player: int): # Mission 1 Upgrade Requirements - add_rule_safe(world, LocationName.pumpkin_hill_1, player, + add_rule_safe(multiworld, LocationName.pumpkin_hill_1, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule_safe(world, LocationName.mission_street_1, player, + add_rule_safe(multiworld, LocationName.mission_street_1, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.hidden_base_1, player, + add_rule_safe(multiworld, LocationName.hidden_base_1, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.death_chamber_1, player, + add_rule_safe(multiworld, LocationName.death_chamber_1, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule_safe(world, LocationName.eternal_engine_1, player, + add_rule_safe(multiworld, LocationName.eternal_engine_1, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule_safe(world, LocationName.crazy_gadget_1, player, + add_rule_safe(multiworld, LocationName.crazy_gadget_1, player, lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule_safe(world, LocationName.final_rush_1, player, + add_rule_safe(multiworld, LocationName.final_rush_1, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.egg_quarters_1, player, + add_rule_safe(multiworld, LocationName.egg_quarters_1, player, lambda state: state.has(ItemName.rouge_pick_nails, player)) - add_rule_safe(world, LocationName.lost_colony_1, player, + add_rule_safe(multiworld, LocationName.lost_colony_1, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.weapons_bed_1, player, + add_rule_safe(multiworld, LocationName.weapons_bed_1, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.cosmic_wall_1, player, + add_rule_safe(multiworld, LocationName.cosmic_wall_1, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.cannon_core_1, player, + add_rule_safe(multiworld, LocationName.cannon_core_1, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.knuckles_hammer_gloves, player)) # Mission 2 Upgrade Requirements - add_rule_safe(world, LocationName.mission_street_2, player, + add_rule_safe(multiworld, LocationName.mission_street_2, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.hidden_base_2, player, + add_rule_safe(multiworld, LocationName.hidden_base_2, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.death_chamber_2, player, + add_rule_safe(multiworld, LocationName.death_chamber_2, player, lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule_safe(world, LocationName.eternal_engine_2, player, - lambda state: state.has(ItemName.tails_booster, player) and - state.has(ItemName.tails_bazooka, player)) + add_rule_safe(multiworld, LocationName.eternal_engine_2, player, + lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.lost_colony_2, player, - lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.weapons_bed_2, player, + add_rule_safe(multiworld, LocationName.weapons_bed_2, player, lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.cosmic_wall_2, player, + add_rule_safe(multiworld, LocationName.cosmic_wall_2, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.cannon_core_2, player, + add_rule_safe(multiworld, LocationName.cannon_core_2, player, lambda state: state.has(ItemName.tails_booster, player)) # Mission 3 Upgrade Requirements - add_rule_safe(world, LocationName.wild_canyon_3, player, + add_rule_safe(multiworld, LocationName.wild_canyon_3, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule_safe(world, LocationName.prison_lane_3, player, + add_rule_safe(multiworld, LocationName.prison_lane_3, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.mission_street_3, player, + add_rule_safe(multiworld, LocationName.mission_street_3, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.aquatic_mine_3, player, + add_rule_safe(multiworld, LocationName.aquatic_mine_3, player, lambda state: state.has(ItemName.knuckles_mystic_melody, player)) - add_rule_safe(world, LocationName.hidden_base_3, player, + add_rule_safe(multiworld, LocationName.hidden_base_3, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_mystic_melody, player)) - add_rule_safe(world, LocationName.death_chamber_3, player, + add_rule_safe(multiworld, LocationName.death_chamber_3, player, lambda state: state.has(ItemName.knuckles_mystic_melody, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule_safe(world, LocationName.eternal_engine_3, player, + add_rule_safe(multiworld, LocationName.eternal_engine_3, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.meteor_herd_3, player, + add_rule_safe(multiworld, LocationName.meteor_herd_3, player, lambda state: state.has(ItemName.knuckles_mystic_melody, player)) - add_rule_safe(world, LocationName.crazy_gadget_3, player, + add_rule_safe(multiworld, LocationName.crazy_gadget_3, player, lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule_safe(world, LocationName.final_rush_3, player, + add_rule_safe(multiworld, LocationName.final_rush_3, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.iron_gate_3, player, + add_rule_safe(multiworld, LocationName.iron_gate_3, player, lambda state: state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.dry_lagoon_3, player, + add_rule_safe(multiworld, LocationName.dry_lagoon_3, player, lambda state: state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule_safe(world, LocationName.sand_ocean_3, player, + add_rule_safe(multiworld, LocationName.sand_ocean_3, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.egg_quarters_3, player, + add_rule_safe(multiworld, LocationName.egg_quarters_3, player, lambda state: state.has(ItemName.rouge_mystic_melody, player)) - add_rule_safe(world, LocationName.lost_colony_3, player, + add_rule_safe(multiworld, LocationName.lost_colony_3, player, lambda state: state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.weapons_bed_3, player, + add_rule_safe(multiworld, LocationName.weapons_bed_3, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.mad_space_3, player, + add_rule_safe(multiworld, LocationName.mad_space_3, player, lambda state: state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule_safe(world, LocationName.cosmic_wall_3, player, + add_rule_safe(multiworld, LocationName.cosmic_wall_3, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.cannon_core_3, player, + add_rule_safe(multiworld, LocationName.cannon_core_3, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.knuckles_hammer_gloves, player)) # Mission 4 Upgrade Requirements - add_rule_safe(world, LocationName.pumpkin_hill_4, player, + add_rule_safe(multiworld, LocationName.pumpkin_hill_4, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule_safe(world, LocationName.mission_street_4, player, + add_rule_safe(multiworld, LocationName.mission_street_4, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.hidden_base_4, player, + add_rule_safe(multiworld, LocationName.hidden_base_4, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.death_chamber_4, player, + add_rule_safe(multiworld, LocationName.death_chamber_4, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule_safe(world, LocationName.eternal_engine_4, player, + add_rule_safe(multiworld, LocationName.eternal_engine_4, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule_safe(world, LocationName.crazy_gadget_4, player, + add_rule_safe(multiworld, LocationName.crazy_gadget_4, player, lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule_safe(world, LocationName.final_rush_4, player, + add_rule_safe(multiworld, LocationName.final_rush_4, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.egg_quarters_4, player, + add_rule_safe(multiworld, LocationName.egg_quarters_4, player, lambda state: state.has(ItemName.rouge_pick_nails, player)) - add_rule_safe(world, LocationName.lost_colony_4, player, + add_rule_safe(multiworld, LocationName.lost_colony_4, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.weapons_bed_4, player, + add_rule_safe(multiworld, LocationName.weapons_bed_4, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.cosmic_wall_4, player, + add_rule_safe(multiworld, LocationName.cosmic_wall_4, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.cannon_core_4, player, + add_rule_safe(multiworld, LocationName.cannon_core_4, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.knuckles_hammer_gloves, player)) # Mission 5 Upgrade Requirements - add_rule_safe(world, LocationName.city_escape_5, player, + add_rule_safe(multiworld, LocationName.city_escape_5, player, lambda state: state.has(ItemName.sonic_flame_ring, player)) - add_rule_safe(world, LocationName.wild_canyon_5, player, + add_rule_safe(multiworld, LocationName.wild_canyon_5, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule_safe(world, LocationName.pumpkin_hill_5, player, + add_rule_safe(multiworld, LocationName.pumpkin_hill_5, player, lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule_safe(world, LocationName.mission_street_5, player, + add_rule_safe(multiworld, LocationName.mission_street_5, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.aquatic_mine_5, player, + add_rule_safe(multiworld, LocationName.aquatic_mine_5, player, lambda state: state.has(ItemName.knuckles_mystic_melody, player)) - add_rule_safe(world, LocationName.hidden_base_5, player, + add_rule_safe(multiworld, LocationName.hidden_base_5, player, lambda state: state.has(ItemName.tails_booster, player)) - add_rule_safe(world, LocationName.death_chamber_5, player, + add_rule_safe(multiworld, LocationName.death_chamber_5, player, lambda state: state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_mystic_melody, player)) - add_rule_safe(world, LocationName.eternal_engine_5, player, + add_rule_safe(multiworld, LocationName.eternal_engine_5, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule_safe(world, LocationName.crazy_gadget_5, player, + add_rule_safe(multiworld, LocationName.crazy_gadget_5, player, lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule_safe(world, LocationName.final_rush_5, player, + add_rule_safe(multiworld, LocationName.final_rush_5, player, lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule_safe(world, LocationName.iron_gate_5, player, + add_rule_safe(multiworld, LocationName.iron_gate_5, player, lambda state: state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.dry_lagoon_5, player, + add_rule_safe(multiworld, LocationName.dry_lagoon_5, player, lambda state: state.has(ItemName.rouge_treasure_scope, player)) - add_rule_safe(world, LocationName.sand_ocean_5, player, + add_rule_safe(multiworld, LocationName.sand_ocean_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.egg_quarters_5, player, + add_rule_safe(multiworld, LocationName.egg_quarters_5, player, lambda state: state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_treasure_scope, player)) - add_rule_safe(world, LocationName.lost_colony_5, player, + add_rule_safe(multiworld, LocationName.lost_colony_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule_safe(world, LocationName.weapons_bed_5, player, + add_rule_safe(multiworld, LocationName.weapons_bed_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.security_hall_5, player, + add_rule_safe(multiworld, LocationName.security_hall_5, player, lambda state: state.has(ItemName.rouge_treasure_scope, player)) - add_rule_safe(world, LocationName.cosmic_wall_5, player, + add_rule_safe(multiworld, LocationName.cosmic_wall_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule_safe(world, LocationName.cannon_core_5, player, + add_rule_safe(multiworld, LocationName.cannon_core_5, player, lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.knuckles_mystic_melody, player) and state.has(ItemName.knuckles_hammer_gloves, player)) # Upgrade Spot Upgrade Requirements - add_rule(world.get_location(LocationName.city_escape_upgrade, player), + add_rule(multiworld.get_location(LocationName.city_escape_upgrade, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.wild_canyon_upgrade, player), + add_rule(multiworld.get_location(LocationName.wild_canyon_upgrade, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule(world.get_location(LocationName.prison_lane_upgrade, player), + add_rule(multiworld.get_location(LocationName.prison_lane_upgrade, player), lambda state: state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.hidden_base_upgrade, player), + add_rule(multiworld.get_location(LocationName.hidden_base_upgrade, player), lambda state: state.has(ItemName.tails_booster, player) and (state.has(ItemName.tails_bazooka, player) or state.has(ItemName.tails_mystic_melody, player))) - add_rule(world.get_location(LocationName.eternal_engine_upgrade, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_upgrade, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.meteor_herd_upgrade, player), + add_rule(multiworld.get_location(LocationName.meteor_herd_upgrade, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.final_rush_upgrade, player), + add_rule(multiworld.get_location(LocationName.final_rush_upgrade, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.iron_gate_upgrade, player), + add_rule(multiworld.get_location(LocationName.iron_gate_upgrade, player), lambda state: state.has(ItemName.eggman_jet_engine, player) or state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.dry_lagoon_upgrade, player), + add_rule(multiworld.get_location(LocationName.dry_lagoon_upgrade, player), lambda state: state.has(ItemName.rouge_pick_nails, player)) - add_rule(world.get_location(LocationName.sand_ocean_upgrade, player), + add_rule(multiworld.get_location(LocationName.sand_ocean_upgrade, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.security_hall_upgrade, player), + add_rule(multiworld.get_location(LocationName.security_hall_upgrade, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_upgrade, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_upgrade, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) # Chao Key Upgrade Requirements - if world.keysanity[player]: - add_rule(world.get_location(LocationName.prison_lane_chao_1, player), + if world.options.keysanity: + add_rule(multiworld.get_location(LocationName.prison_lane_chao_1, player), lambda state: state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.mission_street_chao_1, player), + add_rule(multiworld.get_location(LocationName.mission_street_chao_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_chao_1, player), + add_rule(multiworld.get_location(LocationName.hidden_base_chao_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_chao_1, player), + add_rule(multiworld.get_location(LocationName.death_chamber_chao_1, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_chao_1, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_chao_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.cosmic_wall_chao_1, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_chao_1, player), lambda state: state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_chao_1, player), + add_rule(multiworld.get_location(LocationName.cannon_core_chao_1, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.prison_lane_chao_2, player), + add_rule(multiworld.get_location(LocationName.prison_lane_chao_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.mission_street_chao_2, player), + add_rule(multiworld.get_location(LocationName.mission_street_chao_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_chao_2, player), + add_rule(multiworld.get_location(LocationName.hidden_base_chao_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_chao_2, player), + add_rule(multiworld.get_location(LocationName.death_chamber_chao_2, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_chao_2, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_chao_2, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_chao_2, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_chao_2, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.weapons_bed_chao_2, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_chao_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_chao_2, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_chao_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_chao_2, player), + add_rule(multiworld.get_location(LocationName.cannon_core_chao_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.mission_street_chao_3, player), + add_rule(multiworld.get_location(LocationName.mission_street_chao_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_chao_3, player), + add_rule(multiworld.get_location(LocationName.death_chamber_chao_3, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_chao_3, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_chao_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.crazy_gadget_chao_3, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_chao_3, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.final_rush_chao_3, player), + add_rule(multiworld.get_location(LocationName.final_rush_chao_3, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.egg_quarters_chao_3, player), + add_rule(multiworld.get_location(LocationName.egg_quarters_chao_3, player), lambda state: state.has(ItemName.rouge_mystic_melody, player)) - add_rule(world.get_location(LocationName.lost_colony_chao_3, player), + add_rule(multiworld.get_location(LocationName.lost_colony_chao_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_chao_3, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_chao_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.security_hall_chao_3, player), + add_rule(multiworld.get_location(LocationName.security_hall_chao_3, player), lambda state: state.has(ItemName.rouge_pick_nails, player)) - add_rule(world.get_location(LocationName.cosmic_wall_chao_3, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_chao_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_chao_3, player), + add_rule(multiworld.get_location(LocationName.cannon_core_chao_3, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.sonic_flame_ring, player)) # Pipe Upgrade Requirements - if world.whistlesanity[player].value == 1 or world.whistlesanity[player].value == 3: - add_rule(world.get_location(LocationName.hidden_base_pipe_1, player), + if world.options.whistlesanity.value == 1 or world.options.whistlesanity.value == 3: + add_rule(multiworld.get_location(LocationName.hidden_base_pipe_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.cosmic_wall_pipe_1, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_pipe_1, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.hidden_base_pipe_2, player), + add_rule(multiworld.get_location(LocationName.hidden_base_pipe_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_pipe_2, player), + add_rule(multiworld.get_location(LocationName.death_chamber_pipe_2, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_pipe_2, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_pipe_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.lost_colony_pipe_2, player), + add_rule(multiworld.get_location(LocationName.lost_colony_pipe_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_pipe_2, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_pipe_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_pipe_2, player), + add_rule(multiworld.get_location(LocationName.cannon_core_pipe_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.prison_lane_pipe_3, player), + add_rule(multiworld.get_location(LocationName.prison_lane_pipe_3, player), lambda state: state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.mission_street_pipe_3, player), + add_rule(multiworld.get_location(LocationName.mission_street_pipe_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_pipe_3, player), + add_rule(multiworld.get_location(LocationName.hidden_base_pipe_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_pipe_3, player), + add_rule(multiworld.get_location(LocationName.death_chamber_pipe_3, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_pipe_3, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_pipe_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.weapons_bed_pipe_3, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_pipe_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_pipe_3, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_pipe_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_pipe_3, player), + add_rule(multiworld.get_location(LocationName.cannon_core_pipe_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_pipe_4, player), + add_rule(multiworld.get_location(LocationName.hidden_base_pipe_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.eternal_engine_pipe_4, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_pipe_4, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_pipe_4, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_pipe_4, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.weapons_bed_pipe_4, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_pipe_4, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.cosmic_wall_pipe_4, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_pipe_4, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_pipe_4, player), + add_rule(multiworld.get_location(LocationName.cannon_core_pipe_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_pipe_5, player), + add_rule(multiworld.get_location(LocationName.hidden_base_pipe_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.eternal_engine_pipe_5, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_pipe_5, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.weapons_bed_pipe_5, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_pipe_5, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_pipe_5, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_pipe_5, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_pipe_5, player), + add_rule(multiworld.get_location(LocationName.cannon_core_pipe_5, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.knuckles_hammer_gloves, player)) # Hidden Whistle Upgrade Requirements - if world.whistlesanity[player].value == 2 or world.whistlesanity[player].value == 3: - add_rule(world.get_location(LocationName.mission_street_hidden_3, player), + if world.options.whistlesanity.value == 2 or world.options.whistlesanity.value == 3: + add_rule(multiworld.get_location(LocationName.mission_street_hidden_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.mission_street_hidden_4, player), + add_rule(multiworld.get_location(LocationName.mission_street_hidden_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_hidden_1, player), + add_rule(multiworld.get_location(LocationName.death_chamber_hidden_1, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.death_chamber_hidden_2, player), + add_rule(multiworld.get_location(LocationName.death_chamber_hidden_2, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.cannon_core_hidden_1, player), + add_rule(multiworld.get_location(LocationName.cannon_core_hidden_1, player), lambda state: state.has(ItemName.tails_booster, player)) # Omochao Upgrade Requirements - if world.omosanity[player]: - add_rule(world.get_location(LocationName.eternal_engine_omo_1, player), + if world.options.omosanity: + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_1, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_omo_2, player), + add_rule(multiworld.get_location(LocationName.hidden_base_omo_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_2, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_2, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_2, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.weapons_bed_omo_2, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_omo_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player) or state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.hidden_base_omo_3, player), + add_rule(multiworld.get_location(LocationName.hidden_base_omo_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_3, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.final_rush_omo_3, player), + add_rule(multiworld.get_location(LocationName.final_rush_omo_3, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.weapons_bed_omo_3, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_omo_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.hidden_base_omo_4, player), + add_rule(multiworld.get_location(LocationName.hidden_base_omo_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_4, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_4, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_4, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_4, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.mission_street_omo_5, player), + add_rule(multiworld.get_location(LocationName.mission_street_omo_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_5, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_5, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_5, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_5, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.mission_street_omo_6, player), + add_rule(multiworld.get_location(LocationName.mission_street_omo_6, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_6, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_6, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_6, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_6, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.lost_colony_omo_6, player), + add_rule(multiworld.get_location(LocationName.lost_colony_omo_6, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_6, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_6, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.mission_street_omo_7, player), + add_rule(multiworld.get_location(LocationName.mission_street_omo_7, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_7, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_7, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_7, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_7, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.lost_colony_omo_7, player), + add_rule(multiworld.get_location(LocationName.lost_colony_omo_7, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_7, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_7, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.mission_street_omo_8, player), + add_rule(multiworld.get_location(LocationName.mission_street_omo_8, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_8, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_8, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_8, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_8, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.lost_colony_omo_8, player), + add_rule(multiworld.get_location(LocationName.lost_colony_omo_8, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.security_hall_omo_8, player), + add_rule(multiworld.get_location(LocationName.security_hall_omo_8, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_8, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_8, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.death_chamber_omo_9, player), + add_rule(multiworld.get_location(LocationName.death_chamber_omo_9, player), lambda state: state.has(ItemName.knuckles_mystic_melody, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_9, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_9, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.cannon_core_omo_9, player), + add_rule(multiworld.get_location(LocationName.cannon_core_omo_9, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_10, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_10, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_11, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_11, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.eternal_engine_omo_12, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_omo_12, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_omo_12, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_omo_12, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.crazy_gadget_omo_13, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_omo_13, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) # Gold Beetle Upgrade Requirements - if world.beetlesanity[player]: - add_rule(world.get_location(LocationName.hidden_base_beetle, player), + if world.options.beetlesanity: + add_rule(multiworld.get_location(LocationName.hidden_base_beetle, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_beetle, player), + add_rule(multiworld.get_location(LocationName.death_chamber_beetle, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_beetle, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_beetle, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_beetle, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_beetle, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.dry_lagoon_beetle, player), + add_rule(multiworld.get_location(LocationName.dry_lagoon_beetle, player), lambda state: state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.lost_colony_beetle, player), + add_rule(multiworld.get_location(LocationName.lost_colony_beetle, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_beetle, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_beetle, player), lambda state: state.has(ItemName.eggman_mystic_melody, player) and state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_beetle, player), + add_rule(multiworld.get_location(LocationName.cannon_core_beetle, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.knuckles_hammer_gloves, player)) # Animal Upgrade Requirements - if world.animalsanity[player]: - add_rule(world.get_location(LocationName.hidden_base_animal_2, player), + if world.options.animalsanity: + add_rule(multiworld.get_location(LocationName.hidden_base_animal_2, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_2, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_3, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_3, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_3, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_3, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_3, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_3, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_3, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_3, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_4, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_4, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_4, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_4, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_4, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_4, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_4, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_4, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_4, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_4, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_5, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_5, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_5, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_5, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_5, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_5, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_5, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_5, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_5, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_5, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_6, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_6, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_6, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_6, player), lambda state: state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_6, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_6, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_6, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_6, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_6, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_6, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_6, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_6, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_7, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_7, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_7, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_7, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_7, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_7, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_7, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_7, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.security_hall_animal_7, player), + add_rule(multiworld.get_location(LocationName.security_hall_animal_7, player), lambda state: state.has(ItemName.rouge_pick_nails, player) or state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_7, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_7, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_7, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_7, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_8, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_8, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_8, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_8, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_8, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_8, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_8, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_8, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.security_hall_animal_8, player), + add_rule(multiworld.get_location(LocationName.security_hall_animal_8, player), lambda state: state.has(ItemName.rouge_pick_nails, player) and state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_8, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_8, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_8, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_8, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.mission_street_animal_9, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_9, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_9, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_9, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_9, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_9, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_9, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_9, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.final_rush_animal_9, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_9, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_9, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_9, player), + lambda state: state.has(ItemName.eggman_jet_engine, player) or + state.has(ItemName.eggman_large_cannon, player)) + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_9, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_9, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_9, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_9, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_9, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.wild_canyon_animal_10, player), + add_rule(multiworld.get_location(LocationName.wild_canyon_animal_10, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player)) - add_rule(world.get_location(LocationName.mission_street_animal_10, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_10, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.aquatic_mine_animal_10, player), + add_rule(multiworld.get_location(LocationName.aquatic_mine_animal_10, player), lambda state: state.has(ItemName.knuckles_mystic_melody, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_10, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_10, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.death_chamber_animal_10, player), + add_rule(multiworld.get_location(LocationName.death_chamber_animal_10, player), lambda state: state.has(ItemName.knuckles_shovel_claws, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_10, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_10, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.final_rush_animal_10, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_10, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.egg_quarters_animal_10, player), + add_rule(multiworld.get_location(LocationName.egg_quarters_animal_10, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_10, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_10, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_10, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_10, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.mad_space_animal_10, player), + add_rule(multiworld.get_location(LocationName.mad_space_animal_10, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_10, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_10, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_10, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_10, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.mission_street_animal_11, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_11, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_11, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_11, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_11, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_11, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.final_rush_animal_11, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_11, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_11, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_11, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_11, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_11, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_11, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_11, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_11, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_11, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.mission_street_animal_12, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_12, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_12, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_12, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_12, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_12, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_12, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_12, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.final_rush_animal_12, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_12, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_12, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_12, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_12, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_12, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_12, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_12, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_12, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_12, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.prison_lane_animal_13, player), + add_rule(multiworld.get_location(LocationName.prison_lane_animal_13, player), lambda state: state.has(ItemName.tails_booster, player) or state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.mission_street_animal_13, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_13, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_13, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_13, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_13, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_13, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_13, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_13, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.final_rush_animal_13, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_13, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_13, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_13, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_13, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_13, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_13, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_13, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_13, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_13, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.prison_lane_animal_14, player), + add_rule(multiworld.get_location(LocationName.prison_lane_animal_14, player), lambda state: state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.mission_street_animal_14, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_14, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_14, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_14, player), lambda state: state.has(ItemName.tails_booster, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_14, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_14, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_14, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_14, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.final_rush_animal_14, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_14, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.lost_colony_animal_14, player), + add_rule(multiworld.get_location(LocationName.lost_colony_animal_14, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_14, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_14, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_14, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_14, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_14, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_14, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.prison_lane_animal_15, player), + add_rule(multiworld.get_location(LocationName.prison_lane_animal_15, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.mission_street_animal_15, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_15, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.hidden_base_animal_15, player), + add_rule(multiworld.get_location(LocationName.hidden_base_animal_15, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.eternal_engine_animal_15, player), + add_rule(multiworld.get_location(LocationName.eternal_engine_animal_15, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_15, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_15, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.final_rush_animal_15, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_15, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.iron_gate_animal_15, player), + add_rule(multiworld.get_location(LocationName.iron_gate_animal_15, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.sand_ocean_animal_15, player), + add_rule(multiworld.get_location(LocationName.sand_ocean_animal_15, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.weapons_bed_animal_15, player), + add_rule(multiworld.get_location(LocationName.weapons_bed_animal_15, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and state.has(ItemName.eggman_large_cannon, player)) - add_rule(world.get_location(LocationName.cosmic_wall_animal_15, player), + add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_15, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_15, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_15, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.mission_street_animal_16, player), + add_rule(multiworld.get_location(LocationName.mission_street_animal_16, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.tails_bazooka, player)) - add_rule(world.get_location(LocationName.crazy_gadget_animal_16, player), + add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_16, player), lambda state: state.has(ItemName.sonic_light_shoes, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.final_rush_animal_16, player), + add_rule(multiworld.get_location(LocationName.final_rush_animal_16, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_16, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_16, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.final_chase_animal_17, player), + add_rule(multiworld.get_location(LocationName.final_chase_animal_17, player), lambda state: state.has(ItemName.shadow_flame_ring, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_17, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_17, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_18, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_18, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player) and state.has(ItemName.knuckles_hammer_gloves, player)) - add_rule(world.get_location(LocationName.pyramid_cave_animal_19, player), + add_rule(multiworld.get_location(LocationName.pyramid_cave_animal_19, player), lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and state.has(ItemName.sonic_mystic_melody, player)) - add_rule(world.get_location(LocationName.cannon_core_animal_19, player), + add_rule(multiworld.get_location(LocationName.cannon_core_animal_19, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_large_cannon, player) and state.has(ItemName.knuckles_hammer_gloves, player) and state.has(ItemName.sonic_flame_ring, player)) - add_rule(world.get_location(LocationName.radical_highway_animal_20, player), + add_rule(multiworld.get_location(LocationName.radical_highway_animal_20, player), lambda state: state.has(ItemName.shadow_flame_ring, player)) -def set_boss_gate_rules(world: MultiWorld, player: int, gate_bosses: typing.Dict[int, int]): +def set_boss_gate_rules(multiworld: MultiWorld, player: int, gate_bosses: typing.Dict[int, int]): for x in range(len(gate_bosses)): if boss_has_requirement(gate_bosses[x + 1]): - add_rule(world.get_location(boss_gate_set[x], player), + add_rule(multiworld.get_location(boss_gate_set[x], player), lambda state: state.has(ItemName.knuckles_shovel_claws, player)) -def set_rules(world: MultiWorld, player: int, gate_bosses: typing.Dict[int, int], boss_rush_map: typing.Dict[int, int], mission_map: typing.Dict[int, int], mission_count_map: typing.Dict[int, int]): +def set_rules(multiworld: MultiWorld, world: World, player: int, gate_bosses: typing.Dict[int, int], boss_rush_map: typing.Dict[int, int], mission_map: typing.Dict[int, int], mission_count_map: typing.Dict[int, int], black_market_costs: typing.Dict[int, int]): # Mission Progression Rules (Mission 1 begets Mission 2, etc.) - set_mission_progress_rules(world, player, mission_map, mission_count_map) + set_mission_progress_rules(multiworld, player, mission_map, mission_count_map) - if world.goal[player].value != 3: + if world.options.goal.value != 3: # Upgrade Requirements for each mission location - if world.logic_difficulty[player].value == 0: - set_mission_upgrade_rules_standard(world, player) - elif world.logic_difficulty[player].value == 1: - set_mission_upgrade_rules_hard(world, player) + if world.options.logic_difficulty.value == 0: + set_mission_upgrade_rules_standard(multiworld, world, player) + elif world.options.logic_difficulty.value == 1: + set_mission_upgrade_rules_hard(multiworld, world, player) + + for i in range(world.options.black_market_slots.value): + add_rule(multiworld.get_location(LocationName.chao_black_market_base + str(i + 1), player), + lambda state, i=i: (state.has(ItemName.market_token, player, black_market_costs[i]))) - if world.goal[player] in [4, 5, 6]: + if world.options.goal in [4, 5, 6]: for i in range(16): if boss_rush_map[i] == 10: - add_rule(world.get_location("Boss Rush - " + str(i + 1), player), + add_rule(multiworld.get_location("Boss Rush - " + str(i + 1), player), lambda state: (state.has(ItemName.knuckles_shovel_claws, player))) # Upgrade Requirements for each boss gate - set_boss_gate_rules(world, player, gate_bosses) + set_boss_gate_rules(multiworld, player, gate_bosses) - world.completion_condition[player] = lambda state: state.has(ItemName.maria, player) + multiworld.completion_condition[player] = lambda state: state.has(ItemName.maria, player) diff --git a/worlds/sa2b/__init__.py b/worlds/sa2b/__init__.py index 496d18fa379c..4ee03dce9dc0 100644 --- a/worlds/sa2b/__init__.py +++ b/worlds/sa2b/__init__.py @@ -1,14 +1,18 @@ import typing import math +import logging from BaseClasses import Item, MultiWorld, Tutorial, ItemClassification -from .Items import SA2BItem, ItemData, item_table, upgrades_table, emeralds_table, junk_table, trap_table, item_groups -from .Locations import SA2BLocation, all_locations, setup_locations +from .Items import SA2BItem, ItemData, item_table, upgrades_table, emeralds_table, junk_table, trap_table, item_groups, \ + eggs_table, fruits_table, seeds_table, hats_table, animals_table, chaos_drives_table +from .Locations import SA2BLocation, all_locations, setup_locations, chao_animal_event_location_table, black_market_location_table from .Options import sa2b_options from .Regions import create_regions, shuffleable_regions, connect_regions, LevelGate, gate_0_whitelist_regions, \ gate_0_blacklist_regions from .Rules import set_rules from .Names import ItemName, LocationName +from .AestheticData import chao_name_conversion, sample_chao_names, totally_real_item_names, \ + all_exits, all_destinations, multi_rooms, single_rooms, room_to_exits_map, exit_to_room_map, valid_kindergarten_exits from worlds.AutoWorld import WebWorld, World from .GateBosses import get_gate_bosses, get_boss_rush_bosses, get_boss_name from .Missions import get_mission_table, get_mission_count_table, get_first_and_last_cannons_core_missions @@ -52,7 +56,7 @@ class SA2BWorld(World): game: str = "Sonic Adventure 2 Battle" option_definitions = sa2b_options topology_present = False - data_version = 6 + data_version = 7 item_name_groups = item_groups item_name_to_id = {name: data.code for name, data in item_table.items()} @@ -60,8 +64,6 @@ class SA2BWorld(World): location_table: typing.Dict[str, int] - music_map: typing.Dict[int, int] - voice_map: typing.Dict[int, int] mission_map: typing.Dict[int, int] mission_count_map: typing.Dict[int, int] emblems_for_cannons_core: int @@ -69,138 +71,126 @@ class SA2BWorld(World): gate_costs: typing.Dict[int, int] gate_bosses: typing.Dict[int, int] boss_rush_map: typing.Dict[int, int] + black_market_costs: typing.Dict[int, int] + web = SA2BWeb() - def _get_slot_data(self): + def fill_slot_data(self) -> dict: return { - "ModVersion": 202, - "Goal": self.multiworld.goal[self.player].value, - "MusicMap": self.music_map, - "VoiceMap": self.voice_map, + "ModVersion": 203, + "Goal": self.options.goal.value, + "MusicMap": self.generate_music_data(), + "VoiceMap": self.generate_voice_data(), + "DefaultEggMap": self.generate_chao_egg_data(), + "DefaultChaoNameMap": self.generate_chao_name_data(), "MissionMap": self.mission_map, "MissionCountMap": self.mission_count_map, - "MusicShuffle": self.multiworld.music_shuffle[self.player].value, - "Narrator": self.multiworld.narrator[self.player].value, - "MinigameTrapDifficulty": self.multiworld.minigame_trap_difficulty[self.player].value, - "RingLoss": self.multiworld.ring_loss[self.player].value, - "RingLink": self.multiworld.ring_link[self.player].value, - "RequiredRank": self.multiworld.required_rank[self.player].value, - "ChaoKeys": self.multiworld.keysanity[self.player].value, - "Whistlesanity": self.multiworld.whistlesanity[self.player].value, - "GoldBeetles": self.multiworld.beetlesanity[self.player].value, - "OmochaoChecks": self.multiworld.omosanity[self.player].value, - "AnimalChecks": self.multiworld.animalsanity[self.player].value, - "KartRaceChecks": self.multiworld.kart_race_checks[self.player].value, - "ChaoRaceChecks": self.multiworld.chao_race_checks[self.player].value, - "ChaoGardenDifficulty": self.multiworld.chao_garden_difficulty[self.player].value, - "DeathLink": self.multiworld.death_link[self.player].value, - "EmblemPercentageForCannonsCore": self.multiworld.emblem_percentage_for_cannons_core[self.player].value, - "RequiredCannonsCoreMissions": self.multiworld.required_cannons_core_missions[self.player].value, - "NumberOfLevelGates": self.multiworld.number_of_level_gates[self.player].value, - "LevelGateDistribution": self.multiworld.level_gate_distribution[self.player].value, + "MusicShuffle": self.options.music_shuffle.value, + "Narrator": self.options.narrator.value, + "MinigameTrapDifficulty": self.options.minigame_trap_difficulty.value, + "RingLoss": self.options.ring_loss.value, + "RingLink": self.options.ring_link.value, + "RequiredRank": self.options.required_rank.value, + "ChaoKeys": self.options.keysanity.value, + "Whistlesanity": self.options.whistlesanity.value, + "GoldBeetles": self.options.beetlesanity.value, + "OmochaoChecks": self.options.omosanity.value, + "AnimalChecks": self.options.animalsanity.value, + "KartRaceChecks": self.options.kart_race_checks.value, + "ChaoStadiumChecks": self.options.chao_stadium_checks.value, + "ChaoRaceDifficulty": self.options.chao_race_difficulty.value, + "ChaoKarateDifficulty": self.options.chao_karate_difficulty.value, + "ChaoStats": self.options.chao_stats.value, + "ChaoStatsFrequency": self.options.chao_stats_frequency.value, + "ChaoStatsStamina": self.options.chao_stats_stamina.value, + "ChaoStatsHidden": self.options.chao_stats_hidden.value, + "ChaoAnimalParts": self.options.chao_animal_parts.value, + "ChaoKindergarten": self.options.chao_kindergarten.value, + "BlackMarketSlots": self.options.black_market_slots.value, + "BlackMarketData": self.generate_black_market_data(), + "BlackMarketUnlockCosts": self.black_market_costs, + "BlackMarketUnlockSetting": self.options.black_market_unlock_costs.value, + "ChaoERLayout": self.generate_er_layout(), + "DeathLink": self.options.death_link.value, + "EmblemPercentageForCannonsCore": self.options.emblem_percentage_for_cannons_core.value, + "RequiredCannonsCoreMissions": self.options.required_cannons_core_missions.value, + "NumberOfLevelGates": self.options.number_of_level_gates.value, + "LevelGateDistribution": self.options.level_gate_distribution.value, "EmblemsForCannonsCore": self.emblems_for_cannons_core, "RegionEmblemMap": self.region_emblem_map, "GateCosts": self.gate_costs, "GateBosses": self.gate_bosses, "BossRushMap": self.boss_rush_map, + "PlayerNum": self.player, } - def _create_items(self, name: str): - data = item_table[name] - return [self.create_item(name) for _ in range(data.quantity)] - - def fill_slot_data(self) -> dict: - slot_data = self._get_slot_data() - slot_data["MusicMap"] = self.music_map - for option_name in sa2b_options: - option = getattr(self.multiworld, option_name)[self.player] - slot_data[option_name] = option.value - - return slot_data - - def get_levels_per_gate(self) -> list: - levels_per_gate = list() - max_gate_index = self.multiworld.number_of_level_gates[self.player] - average_level_count = 30 / (max_gate_index + 1) - levels_added = 0 - - for i in range(max_gate_index + 1): - levels_per_gate.append(average_level_count) - levels_added += average_level_count - additional_count_iterator = 0 - while levels_added < 30: - levels_per_gate[additional_count_iterator] += 1 - levels_added += 1 - additional_count_iterator += 1 if additional_count_iterator < max_gate_index else -max_gate_index - - if self.multiworld.level_gate_distribution[self.player] == 0 or self.multiworld.level_gate_distribution[self.player] == 2: - early_distribution = self.multiworld.level_gate_distribution[self.player] == 0 - levels_to_distribute = 5 - gate_index_offset = 0 - while levels_to_distribute > 0: - if levels_per_gate[0 + gate_index_offset] == 1 or \ - levels_per_gate[max_gate_index - gate_index_offset] == 1: - break - if early_distribution: - levels_per_gate[0 + gate_index_offset] += 1 - levels_per_gate[max_gate_index - gate_index_offset] -= 1 - else: - levels_per_gate[0 + gate_index_offset] -= 1 - levels_per_gate[max_gate_index - gate_index_offset] += 1 - gate_index_offset += 1 - if gate_index_offset > math.floor(max_gate_index / 2): - gate_index_offset = 0 - levels_to_distribute -= 1 - - return levels_per_gate - def generate_early(self): - if self.multiworld.goal[self.player].value == 3: + if self.options.goal.value == 3: # Turn off everything else for Grand Prix goal - self.multiworld.number_of_level_gates[self.player].value = 0 - self.multiworld.emblem_percentage_for_cannons_core[self.player].value = 0 - self.multiworld.junk_fill_percentage[self.player].value = 100 - self.multiworld.trap_fill_percentage[self.player].value = 100 - self.multiworld.omochao_trap_weight[self.player].value = 0 - self.multiworld.timestop_trap_weight[self.player].value = 0 - self.multiworld.confusion_trap_weight[self.player].value = 0 - self.multiworld.tiny_trap_weight[self.player].value = 0 - self.multiworld.gravity_trap_weight[self.player].value = 0 - self.multiworld.ice_trap_weight[self.player].value = 0 - self.multiworld.slow_trap_weight[self.player].value = 0 - - valid_trap_weights = self.multiworld.exposition_trap_weight[self.player].value + \ - self.multiworld.cutscene_trap_weight[self.player].value + \ - self.multiworld.pong_trap_weight[self.player].value + self.options.number_of_level_gates.value = 0 + self.options.emblem_percentage_for_cannons_core.value = 0 + + self.options.chao_race_difficulty.value = 0 + self.options.chao_karate_difficulty.value = 0 + self.options.chao_stats.value = 0 + self.options.chao_animal_parts.value = 0 + self.options.chao_kindergarten.value = 0 + self.options.black_market_slots.value = 0 + + self.options.junk_fill_percentage.value = 100 + self.options.trap_fill_percentage.value = 100 + self.options.omochao_trap_weight.value = 0 + self.options.timestop_trap_weight.value = 0 + self.options.confusion_trap_weight.value = 0 + self.options.tiny_trap_weight.value = 0 + self.options.gravity_trap_weight.value = 0 + self.options.ice_trap_weight.value = 0 + self.options.slow_trap_weight.value = 0 + self.options.cutscene_trap_weight.value = 0 + + valid_trap_weights = self.options.exposition_trap_weight.value + \ + self.options.reverse_trap_weight.value + \ + self.options.pong_trap_weight.value if valid_trap_weights == 0: - self.multiworld.exposition_trap_weight[self.player].value = 4 - self.multiworld.cutscene_trap_weight[self.player].value = 4 - self.multiworld.pong_trap_weight[self.player].value = 4 + self.options.exposition_trap_weight.value = 4 + self.options.reverse_trap_weight.value = 4 + self.options.pong_trap_weight.value = 4 - if self.multiworld.kart_race_checks[self.player].value == 0: - self.multiworld.kart_race_checks[self.player].value = 2 + if self.options.kart_race_checks.value == 0: + self.options.kart_race_checks.value = 2 self.gate_bosses = {} self.boss_rush_map = {} else: - self.gate_bosses = get_gate_bosses(self.multiworld, self.player) - self.boss_rush_map = get_boss_rush_bosses(self.multiworld, self.player) + self.gate_bosses = get_gate_bosses(self.multiworld, self) + self.boss_rush_map = get_boss_rush_bosses(self.multiworld, self) def create_regions(self): - self.mission_map = get_mission_table(self.multiworld, self.player) - self.mission_count_map = get_mission_count_table(self.multiworld, self.player) + self.mission_map = get_mission_table(self.multiworld, self, self.player) + self.mission_count_map = get_mission_count_table(self.multiworld, self, self.player) - self.location_table = setup_locations(self.multiworld, self.player, self.mission_map, self.mission_count_map) - create_regions(self.multiworld, self.player, self.location_table) + self.location_table = setup_locations(self, self.player, self.mission_map, self.mission_count_map) + create_regions(self.multiworld, self, self.player, self.location_table) # Not Generate Basic - if self.multiworld.goal[self.player].value in [0, 2, 4, 5, 6]: + self.black_market_costs = dict() + + if self.options.goal.value in [0, 2, 4, 5, 6]: self.multiworld.get_location(LocationName.finalhazard, self.player).place_locked_item(self.create_item(ItemName.maria)) - elif self.multiworld.goal[self.player].value == 1: + elif self.options.goal.value == 1: self.multiworld.get_location(LocationName.green_hill, self.player).place_locked_item(self.create_item(ItemName.maria)) - elif self.multiworld.goal[self.player].value == 3: + elif self.options.goal.value == 3: self.multiworld.get_location(LocationName.grand_prix, self.player).place_locked_item(self.create_item(ItemName.maria)) + elif self.options.goal.value == 7: + self.multiworld.get_location(LocationName.chaos_chao, self.player).place_locked_item(self.create_item(ItemName.maria)) + + for animal_name in chao_animal_event_location_table.keys(): + animal_region = self.multiworld.get_region(animal_name, self.player) + animal_event_location = SA2BLocation(self.player, animal_name, None, animal_region) + animal_region.locations.append(animal_event_location) + animal_event_item = SA2BItem(animal_name, ItemClassification.progression, None, self.player) + self.multiworld.get_location(animal_name, self.player).place_locked_item(animal_event_item) itempool: typing.List[SA2BItem] = [] @@ -208,28 +198,40 @@ def create_regions(self): total_required_locations = len(self.location_table) total_required_locations -= 1; # Locked Victory Location - if self.multiworld.goal[self.player].value != 3: + if self.options.goal.value != 3: # Fill item pool with all required items for item in {**upgrades_table}: - itempool += [self.create_item(item, False, self.multiworld.goal[self.player].value)] + itempool += [self.create_item(item, False, self.options.goal.value)] - if self.multiworld.goal[self.player].value in [1, 2, 6]: + if self.options.goal.value in [1, 2, 6]: # Some flavor of Chaos Emerald Hunt for item in {**emeralds_table}: - itempool += self._create_items(item) + itempool.append(self.create_item(item)) + + # Black Market + itempool += [self.create_item(ItemName.market_token) for _ in range(self.options.black_market_slots.value)] + + black_market_unlock_mult = 1.0 + if self.options.black_market_unlock_costs.value == 0: + black_market_unlock_mult = 0.5 + elif self.options.black_market_unlock_costs.value == 1: + black_market_unlock_mult = 0.75 + + for i in range(self.options.black_market_slots.value): + self.black_market_costs[i] = math.floor((i + 1) * black_market_unlock_mult) # Cap at player-specified Emblem count raw_emblem_count = total_required_locations - len(itempool) - total_emblem_count = min(raw_emblem_count, self.multiworld.max_emblem_cap[self.player].value) + total_emblem_count = min(raw_emblem_count, self.options.max_emblem_cap.value) extra_junk_count = raw_emblem_count - total_emblem_count self.emblems_for_cannons_core = math.floor( - total_emblem_count * (self.multiworld.emblem_percentage_for_cannons_core[self.player].value / 100.0)) + total_emblem_count * (self.options.emblem_percentage_for_cannons_core.value / 100.0)) gate_cost_mult = 1.0 - if self.multiworld.level_gate_costs[self.player].value == 0: + if self.options.level_gate_costs.value == 0: gate_cost_mult = 0.6 - elif self.multiworld.level_gate_costs[self.player].value == 1: + elif self.options.level_gate_costs.value == 1: gate_cost_mult = 0.8 shuffled_region_list = list(range(30)) @@ -253,8 +255,8 @@ def create_regions(self): total_levels_added += 1 if levels_added_to_gate >= levels_per_gate[current_gate]: current_gate += 1 - if current_gate > self.multiworld.number_of_level_gates[self.player].value: - current_gate = self.multiworld.number_of_level_gates[self.player].value + if current_gate > self.options.number_of_level_gates.value: + current_gate = self.options.number_of_level_gates.value else: current_gate_emblems = max( math.floor(total_emblem_count * math.pow(total_levels_added / 30.0, 2.0) * gate_cost_mult), current_gate) @@ -266,38 +268,70 @@ def create_regions(self): first_cannons_core_mission, final_cannons_core_mission = get_first_and_last_cannons_core_missions(self.mission_map, self.mission_count_map) - connect_regions(self.multiworld, self.player, gates, self.emblems_for_cannons_core, self.gate_bosses, self.boss_rush_map, first_cannons_core_mission, final_cannons_core_mission) + connect_regions(self.multiworld, self, self.player, gates, self.emblems_for_cannons_core, self.gate_bosses, self.boss_rush_map, first_cannons_core_mission, final_cannons_core_mission) max_required_emblems = max(max(emblem_requirement_list), self.emblems_for_cannons_core) itempool += [self.create_item(ItemName.emblem) for _ in range(max_required_emblems)] non_required_emblems = (total_emblem_count - max_required_emblems) - junk_count = math.floor(non_required_emblems * (self.multiworld.junk_fill_percentage[self.player].value / 100.0)) + junk_count = math.floor(non_required_emblems * (self.options.junk_fill_percentage.value / 100.0)) itempool += [self.create_item(ItemName.emblem, True) for _ in range(non_required_emblems - junk_count)] # Carve Traps out of junk_count trap_weights = [] - trap_weights += ([ItemName.omochao_trap] * self.multiworld.omochao_trap_weight[self.player].value) - trap_weights += ([ItemName.timestop_trap] * self.multiworld.timestop_trap_weight[self.player].value) - trap_weights += ([ItemName.confuse_trap] * self.multiworld.confusion_trap_weight[self.player].value) - trap_weights += ([ItemName.tiny_trap] * self.multiworld.tiny_trap_weight[self.player].value) - trap_weights += ([ItemName.gravity_trap] * self.multiworld.gravity_trap_weight[self.player].value) - trap_weights += ([ItemName.exposition_trap] * self.multiworld.exposition_trap_weight[self.player].value) - #trap_weights += ([ItemName.darkness_trap] * self.multiworld.darkness_trap_weight[self.player].value) - trap_weights += ([ItemName.ice_trap] * self.multiworld.ice_trap_weight[self.player].value) - trap_weights += ([ItemName.slow_trap] * self.multiworld.slow_trap_weight[self.player].value) - trap_weights += ([ItemName.cutscene_trap] * self.multiworld.cutscene_trap_weight[self.player].value) - trap_weights += ([ItemName.pong_trap] * self.multiworld.pong_trap_weight[self.player].value) + trap_weights += ([ItemName.omochao_trap] * self.options.omochao_trap_weight.value) + trap_weights += ([ItemName.timestop_trap] * self.options.timestop_trap_weight.value) + trap_weights += ([ItemName.confuse_trap] * self.options.confusion_trap_weight.value) + trap_weights += ([ItemName.tiny_trap] * self.options.tiny_trap_weight.value) + trap_weights += ([ItemName.gravity_trap] * self.options.gravity_trap_weight.value) + trap_weights += ([ItemName.exposition_trap] * self.options.exposition_trap_weight.value) + #trap_weights += ([ItemName.darkness_trap] * self.options.darkness_trap_weight.value) + trap_weights += ([ItemName.ice_trap] * self.options.ice_trap_weight.value) + trap_weights += ([ItemName.slow_trap] * self.options.slow_trap_weight.value) + trap_weights += ([ItemName.cutscene_trap] * self.options.cutscene_trap_weight.value) + trap_weights += ([ItemName.reverse_trap] * self.options.reverse_trap_weight.value) + trap_weights += ([ItemName.pong_trap] * self.options.pong_trap_weight.value) junk_count += extra_junk_count - trap_count = 0 if (len(trap_weights) == 0) else math.ceil(junk_count * (self.multiworld.trap_fill_percentage[self.player].value / 100.0)) + trap_count = 0 if (len(trap_weights) == 0) else math.ceil(junk_count * (self.options.trap_fill_percentage.value / 100.0)) junk_count -= trap_count + chao_active = self.any_chao_locations_active() junk_pool = [] junk_keys = list(junk_table.keys()) + + # Chao Junk + if chao_active: + junk_keys += list(chaos_drives_table.keys()) + eggs_keys = list(eggs_table.keys()) + fruits_keys = list(fruits_table.keys()) + seeds_keys = list(seeds_table.keys()) + hats_keys = list(hats_table.keys()) + eggs_count = 0 + seeds_count = 0 + hats_count = 0 + for i in range(junk_count): - junk_item = self.multiworld.random.choice(junk_keys) - junk_pool.append(self.create_item(junk_item)) + junk_type = self.random.randint(0, len(junk_keys) + 3) + + if chao_active and junk_type == len(junk_keys) + 0 and eggs_count < 20: + junk_item = self.multiworld.random.choice(eggs_keys) + junk_pool.append(self.create_item(junk_item)) + eggs_count += 1 + elif chao_active and junk_type == len(junk_keys) + 1: + junk_item = self.multiworld.random.choice(fruits_keys) + junk_pool.append(self.create_item(junk_item)) + elif chao_active and junk_type == len(junk_keys) + 2 and seeds_count < 12: + junk_item = self.multiworld.random.choice(seeds_keys) + junk_pool.append(self.create_item(junk_item)) + seeds_count += 1 + elif chao_active and junk_type == len(junk_keys) + 3 and hats_count < 20: + junk_item = self.multiworld.random.choice(hats_keys) + junk_pool.append(self.create_item(junk_item)) + hats_count += 1 + else: + junk_item = self.multiworld.random.choice(junk_keys) + junk_pool.append(self.create_item(junk_item)) itempool += junk_pool @@ -310,95 +344,6 @@ def create_regions(self): self.multiworld.itempool += itempool - # Music Shuffle - if self.multiworld.music_shuffle[self.player] == "levels": - musiclist_o = list(range(0, 47)) - musiclist_s = musiclist_o.copy() - self.multiworld.random.shuffle(musiclist_s) - musiclist_o.extend(range(47, 78)) - musiclist_s.extend(range(47, 78)) - - if self.multiworld.sadx_music[self.player].value == 1: - musiclist_s = [x+100 for x in musiclist_s] - elif self.multiworld.sadx_music[self.player].value == 2: - for i in range(len(musiclist_s)): - if self.multiworld.random.randint(0,1): - musiclist_s[i] += 100 - - self.music_map = dict(zip(musiclist_o, musiclist_s)) - elif self.multiworld.music_shuffle[self.player] == "full": - musiclist_o = list(range(0, 78)) - musiclist_s = musiclist_o.copy() - self.multiworld.random.shuffle(musiclist_s) - - if self.multiworld.sadx_music[self.player].value == 1: - musiclist_s = [x+100 for x in musiclist_s] - elif self.multiworld.sadx_music[self.player].value == 2: - for i in range(len(musiclist_s)): - if self.multiworld.random.randint(0,1): - musiclist_s[i] += 100 - - self.music_map = dict(zip(musiclist_o, musiclist_s)) - elif self.multiworld.music_shuffle[self.player] == "singularity": - musiclist_o = list(range(0, 78)) - musiclist_s = [self.multiworld.random.choice(musiclist_o)] * len(musiclist_o) - - if self.multiworld.sadx_music[self.player].value == 1: - musiclist_s = [x+100 for x in musiclist_s] - elif self.multiworld.sadx_music[self.player].value == 2: - if self.multiworld.random.randint(0,1): - musiclist_s = [x+100 for x in musiclist_s] - - self.music_map = dict(zip(musiclist_o, musiclist_s)) - else: - musiclist_o = list(range(0, 78)) - musiclist_s = musiclist_o.copy() - - if self.multiworld.sadx_music[self.player].value == 1: - musiclist_s = [x+100 for x in musiclist_s] - elif self.multiworld.sadx_music[self.player].value == 2: - for i in range(len(musiclist_s)): - if self.multiworld.random.randint(0,1): - musiclist_s[i] += 100 - - self.music_map = dict(zip(musiclist_o, musiclist_s)) - - # Voice Shuffle - if self.multiworld.voice_shuffle[self.player] == "shuffled": - voicelist_o = list(range(0, 2623)) - voicelist_s = voicelist_o.copy() - self.multiworld.random.shuffle(voicelist_s) - - self.voice_map = dict(zip(voicelist_o, voicelist_s)) - elif self.multiworld.voice_shuffle[self.player] == "rude": - voicelist_o = list(range(0, 2623)) - voicelist_s = voicelist_o.copy() - self.multiworld.random.shuffle(voicelist_s) - - for i in range(len(voicelist_s)): - if self.multiworld.random.randint(1,100) > 80: - voicelist_s[i] = 17 - - self.voice_map = dict(zip(voicelist_o, voicelist_s)) - elif self.multiworld.voice_shuffle[self.player] == "chao": - voicelist_o = list(range(0, 2623)) - voicelist_s = voicelist_o.copy() - self.multiworld.random.shuffle(voicelist_s) - - for i in range(len(voicelist_s)): - voicelist_s[i] = self.multiworld.random.choice(range(2586, 2608)) - - self.voice_map = dict(zip(voicelist_o, voicelist_s)) - elif self.multiworld.voice_shuffle[self.player] == "singularity": - voicelist_o = list(range(0, 2623)) - voicelist_s = [self.multiworld.random.choice(voicelist_o)] * len(voicelist_o) - - self.voice_map = dict(zip(voicelist_o, voicelist_s)) - else: - voicelist_o = list(range(0, 2623)) - voicelist_s = voicelist_o.copy() - - self.voice_map = dict(zip(voicelist_o, voicelist_s)) def create_item(self, name: str, force_non_progression=False, goal=0) -> Item: @@ -422,26 +367,32 @@ def create_item(self, name: str, force_non_progression=False, goal=0) -> Item: return created_item def get_filler_item_name(self) -> str: - return self.multiworld.random.choice(list(junk_table.keys())) + junk_keys = list(junk_table.keys()) + + # Chao Junk + if self.any_chao_locations_active(): + junk_keys += list(chaos_drives_table.keys()) + + return self.multiworld.random.choice(junk_keys) def set_rules(self): - set_rules(self.multiworld, self.player, self.gate_bosses, self.boss_rush_map, self.mission_map, self.mission_count_map) + set_rules(self.multiworld, self, self.player, self.gate_bosses, self.boss_rush_map, self.mission_map, self.mission_count_map, self.black_market_costs) def write_spoiler(self, spoiler_handle: typing.TextIO): - if self.multiworld.number_of_level_gates[self.player].value > 0 or self.multiworld.goal[self.player].value in [4, 5, 6]: + if self.options.number_of_level_gates.value > 0 or self.options.goal.value in [4, 5, 6]: spoiler_handle.write("\n") header_text = "Sonic Adventure 2 Bosses for {}:\n" header_text = header_text.format(self.multiworld.player_name[self.player]) spoiler_handle.write(header_text) - if self.multiworld.number_of_level_gates[self.player].value > 0: + if self.options.number_of_level_gates.value > 0: for x in range(len(self.gate_bosses.values())): text = "Gate {0} Boss: {1}\n" text = text.format((x + 1), get_boss_name(self.gate_bosses[x + 1])) spoiler_handle.writelines(text) spoiler_handle.write("\n") - if self.multiworld.goal[self.player].value in [4, 5, 6]: + if self.options.goal.value in [4, 5, 6]: for x in range(len(self.boss_rush_map.values())): text = "Boss Rush Boss {0}: {1}\n" text = text.format((x + 1), get_boss_name(self.boss_rush_map[x])) @@ -459,12 +410,21 @@ def extend_hint_information(self, hint_data: typing.Dict[int, typing.Dict[int, s ] no_hint_region_names = [ LocationName.cannon_core_region, - LocationName.chao_garden_beginner_region, - LocationName.chao_garden_intermediate_region, - LocationName.chao_garden_expert_region, + LocationName.chao_race_beginner_region, + LocationName.chao_race_intermediate_region, + LocationName.chao_race_expert_region, + LocationName.chao_karate_beginner_region, + LocationName.chao_karate_intermediate_region, + LocationName.chao_karate_expert_region, + LocationName.chao_karate_super_region, + LocationName.kart_race_beginner_region, + LocationName.kart_race_standard_region, + LocationName.kart_race_expert_region, + LocationName.chao_kindergarten_region, + LocationName.black_market_region, ] er_hint_data = {} - for i in range(self.multiworld.number_of_level_gates[self.player].value + 1): + for i in range(self.options.number_of_level_gates.value + 1): gate_name = gate_names[i] gate_region = self.multiworld.get_region(gate_name, self.player) if not gate_region: @@ -476,10 +436,353 @@ def extend_hint_information(self, hint_data: typing.Dict[int, typing.Dict[int, s for location in level_region.locations: er_hint_data[location.address] = gate_name + for i in range(self.options.black_market_slots.value): + location = self.multiworld.get_location(LocationName.chao_black_market_base + str(i + 1), self.player) + er_hint_data[location.address] = str(self.black_market_costs[i]) + " " + str(ItemName.market_token) + + hint_data[self.player] = er_hint_data @classmethod - def stage_fill_hook(cls, world, progitempool, usefulitempool, filleritempool, fill_locations): - if world.get_game_players("Sonic Adventure 2 Battle"): + def stage_fill_hook(cls, multiworld: MultiWorld, progitempool, usefulitempool, filleritempool, fill_locations): + if multiworld.get_game_players("Sonic Adventure 2 Battle"): progitempool.sort( key=lambda item: 0 if (item.name != 'Emblem') else 1) + + def get_levels_per_gate(self) -> list: + levels_per_gate = list() + max_gate_index = self.options.number_of_level_gates + average_level_count = 30 / (max_gate_index + 1) + levels_added = 0 + + for i in range(max_gate_index + 1): + levels_per_gate.append(average_level_count) + levels_added += average_level_count + additional_count_iterator = 0 + while levels_added < 30: + levels_per_gate[additional_count_iterator] += 1 + levels_added += 1 + additional_count_iterator += 1 if additional_count_iterator < max_gate_index else -max_gate_index + + if self.options.level_gate_distribution == 0 or self.options.level_gate_distribution == 2: + early_distribution = self.options.level_gate_distribution == 0 + levels_to_distribute = 5 + gate_index_offset = 0 + while levels_to_distribute > 0: + if levels_per_gate[0 + gate_index_offset] == 1 or \ + levels_per_gate[max_gate_index - gate_index_offset] == 1: + break + if early_distribution: + levels_per_gate[0 + gate_index_offset] += 1 + levels_per_gate[max_gate_index - gate_index_offset] -= 1 + else: + levels_per_gate[0 + gate_index_offset] -= 1 + levels_per_gate[max_gate_index - gate_index_offset] += 1 + gate_index_offset += 1 + if gate_index_offset > math.floor(max_gate_index / 2): + gate_index_offset = 0 + levels_to_distribute -= 1 + + return levels_per_gate + + def any_chao_locations_active(self) -> bool: + if self.options.chao_race_difficulty.value > 0 or \ + self.options.chao_karate_difficulty.value > 0 or \ + self.options.chao_stats.value > 0 or \ + self.options.chao_animal_parts or \ + self.options.chao_kindergarten or \ + self.options.black_market_slots.value > 0: + return True; + + return False + + def generate_music_data(self) -> typing.Dict[int, int]: + if self.options.music_shuffle == "levels": + musiclist_o = list(range(0, 47)) + musiclist_s = musiclist_o.copy() + self.random.shuffle(musiclist_s) + musiclist_o.extend(range(47, 78)) + musiclist_s.extend(range(47, 78)) + + if self.options.sadx_music.value == 1: + musiclist_s = [x+100 for x in musiclist_s] + elif self.options.sadx_music.value == 2: + for i in range(len(musiclist_s)): + if self.random.randint(0,1): + musiclist_s[i] += 100 + + return dict(zip(musiclist_o, musiclist_s)) + elif self.options.music_shuffle == "full": + musiclist_o = list(range(0, 78)) + musiclist_s = musiclist_o.copy() + self.random.shuffle(musiclist_s) + + if self.options.sadx_music.value == 1: + musiclist_s = [x+100 for x in musiclist_s] + elif self.options.sadx_music.value == 2: + for i in range(len(musiclist_s)): + if self.random.randint(0,1): + musiclist_s[i] += 100 + + return dict(zip(musiclist_o, musiclist_s)) + elif self.options.music_shuffle == "singularity": + musiclist_o = list(range(0, 78)) + musiclist_s = [self.random.choice(musiclist_o)] * len(musiclist_o) + + if self.options.sadx_music.value == 1: + musiclist_s = [x+100 for x in musiclist_s] + elif self.options.sadx_music.value == 2: + if self.random.randint(0,1): + musiclist_s = [x+100 for x in musiclist_s] + + return dict(zip(musiclist_o, musiclist_s)) + else: + musiclist_o = list(range(0, 78)) + musiclist_s = musiclist_o.copy() + + if self.options.sadx_music.value == 1: + musiclist_s = [x+100 for x in musiclist_s] + elif self.options.sadx_music.value == 2: + for i in range(len(musiclist_s)): + if self.random.randint(0,1): + musiclist_s[i] += 100 + + return dict(zip(musiclist_o, musiclist_s)) + + def generate_voice_data(self) -> typing.Dict[int, int]: + if self.options.voice_shuffle == "shuffled": + voicelist_o = list(range(0, 2623)) + voicelist_s = voicelist_o.copy() + self.random.shuffle(voicelist_s) + + return dict(zip(voicelist_o, voicelist_s)) + elif self.options.voice_shuffle == "rude": + voicelist_o = list(range(0, 2623)) + voicelist_s = voicelist_o.copy() + self.random.shuffle(voicelist_s) + + for i in range(len(voicelist_s)): + if self.random.randint(1,100) > 80: + voicelist_s[i] = 17 + + return dict(zip(voicelist_o, voicelist_s)) + elif self.options.voice_shuffle == "chao": + voicelist_o = list(range(0, 2623)) + voicelist_s = voicelist_o.copy() + self.random.shuffle(voicelist_s) + + for i in range(len(voicelist_s)): + voicelist_s[i] = self.random.choice(range(2586, 2608)) + + return dict(zip(voicelist_o, voicelist_s)) + elif self.options.voice_shuffle == "singularity": + voicelist_o = list(range(0, 2623)) + voicelist_s = [self.random.choice(voicelist_o)] * len(voicelist_o) + + return dict(zip(voicelist_o, voicelist_s)) + else: + voicelist_o = list(range(0, 2623)) + voicelist_s = voicelist_o.copy() + + return dict(zip(voicelist_o, voicelist_s)) + + def generate_chao_egg_data(self) -> typing.Dict[int, int]: + if self.options.shuffle_starting_chao_eggs: + egglist_o = list(range(0, 4)) + egglist_s = self.random.sample(range(0,54), 4) + + return dict(zip(egglist_o, egglist_s)) + else: + # Indicate these are not shuffled + egglist_o = [0, 1, 2, 3] + egglist_s = [255, 255, 255, 255] + + return dict(zip(egglist_o, egglist_s)) + + def generate_chao_name_data(self) -> typing.Dict[int, int]: + number_of_names = 30 + name_list_o = list(range(number_of_names * 7)) + name_list_s = [] + + name_list_base = [] + name_list_copy = list(self.multiworld.player_name.values()) + name_list_copy.remove(self.multiworld.player_name[self.player]) + + if len(name_list_copy) >= number_of_names: + name_list_base = self.random.sample(name_list_copy, number_of_names) + else: + name_list_base = name_list_copy + self.random.shuffle(name_list_base) + + name_list_base += self.random.sample(sample_chao_names, number_of_names - len(name_list_base)) + + for name in name_list_base: + for char_idx in range(7): + if char_idx < len(name): + name_list_s.append(chao_name_conversion[name[char_idx]]) + else: + name_list_s.append(0x00) + + return dict(zip(name_list_o, name_list_s)) + + def generate_black_market_data(self) -> typing.Dict[int, int]: + if self.options.black_market_slots.value == 0: + return {} + + ring_costs = [50, 75, 100] + + market_data = {} + item_names = [] + player_names = [] + progression_flags = [] + totally_real_item_names_copy = totally_real_item_names.copy() + location_names = [(LocationName.chao_black_market_base + str(i)) for i in range(1, self.options.black_market_slots.value + 1)] + locations = [self.multiworld.get_location(location_name, self.player) for location_name in location_names] + for location in locations: + if location.item.classification & ItemClassification.trap: + item_name = self.random.choice(totally_real_item_names_copy) + totally_real_item_names_copy.remove(item_name) + item_names.append(item_name) + else: + item_names.append(location.item.name) + player_names.append(self.multiworld.player_name[location.item.player]) + + if location.item.classification & ItemClassification.progression or location.item.classification & ItemClassification.trap: + progression_flags.append(2) + elif location.item.classification & ItemClassification.useful: + progression_flags.append(1) + else: + progression_flags.append(0) + + for item_idx in range(self.options.black_market_slots.value): + for chr_idx in range(len(item_names[item_idx][:26])): + market_data[(item_idx * 46) + chr_idx] = ord(item_names[item_idx][chr_idx]) + for chr_idx in range(len(player_names[item_idx][:16])): + market_data[(item_idx * 46) + 26 + chr_idx] = ord(player_names[item_idx][chr_idx]) + + market_data[(item_idx * 46) + 42] = ring_costs[progression_flags[item_idx]] * self.options.black_market_price_multiplier.value + + return market_data + + def generate_er_layout(self) -> typing.Dict[int, int]: + if not self.options.chao_entrance_randomization: + return {} + + er_layout = {} + + start_exit = self.random.randint(0, 3) + accessible_rooms = [] + + multi_rooms_copy = multi_rooms.copy() + single_rooms_copy = single_rooms.copy() + all_exits_copy = all_exits.copy() + all_destinations_copy = all_destinations.copy() + + multi_rooms_copy.remove(0x07) + accessible_rooms.append(0x07) + + # Place Kindergarten somewhere sane + exit_choice = self.random.choice(valid_kindergarten_exits) + exit_room = exit_to_room_map[exit_choice] + all_exits_copy.remove(exit_choice) + multi_rooms_copy.remove(exit_room) + + destination = 0x06 + single_rooms_copy.remove(destination) + all_destinations_copy.remove(destination) + + er_layout[exit_choice] = destination + + reverse_exit = self.random.choice(room_to_exits_map[destination]) + + er_layout[reverse_exit] = exit_to_room_map[exit_choice] + + all_exits_copy.remove(reverse_exit) + all_destinations_copy.remove(exit_room) + + # Connect multi-exit rooms + loop_guard = 0 + while len(multi_rooms_copy) > 0: + loop_guard += 1 + if loop_guard > 2000: + logging.warning(f"Failed to generate Chao Entrance Randomization for player: {self.multiworld.player_name[self.player]}") + return {} + + exit_room = self.random.choice(accessible_rooms) + possible_exits = [exit for exit in room_to_exits_map[exit_room] if exit in all_exits_copy] + if len(possible_exits) == 0: + continue + exit_choice = self.random.choice(possible_exits) + all_exits_copy.remove(exit_choice) + + destination = self.random.choice(multi_rooms_copy) + multi_rooms_copy.remove(destination) + all_destinations_copy.remove(destination) + accessible_rooms.append(destination) + + er_layout[exit_choice] = destination + + reverse_exit = self.random.choice(room_to_exits_map[destination]) + + er_layout[reverse_exit] = exit_room + + all_exits_copy.remove(reverse_exit) + all_destinations_copy.remove(exit_room) + + # Connect dead-end rooms + loop_guard = 0 + while len(single_rooms_copy) > 0: + loop_guard += 1 + if loop_guard > 2000: + logging.warning(f"Failed to generate Chao Entrance Randomization for player: {self.multiworld.player_name[self.player]}") + return {} + + exit_room = self.random.choice(accessible_rooms) + possible_exits = [exit for exit in room_to_exits_map[exit_room] if exit in all_exits_copy] + if len(possible_exits) == 0: + continue + exit_choice = self.random.choice(possible_exits) + all_exits_copy.remove(exit_choice) + + destination = self.random.choice(single_rooms_copy) + single_rooms_copy.remove(destination) + all_destinations_copy.remove(destination) + + er_layout[exit_choice] = destination + + reverse_exit = self.random.choice(room_to_exits_map[destination]) + + er_layout[reverse_exit] = exit_room + + all_exits_copy.remove(reverse_exit) + all_destinations_copy.remove(exit_room) + + # Connect remaining exits + loop_guard = 0 + while len(all_exits_copy) > 0: + loop_guard += 1 + if loop_guard > 2000: + logging.warning(f"Failed to generate Chao Entrance Randomization for player: {self.multiworld.player_name[self.player]}") + return {} + + exit_room = self.random.choice(all_destinations_copy) + possible_exits = [exit for exit in room_to_exits_map[exit_room] if exit in all_exits_copy] + if len(possible_exits) == 0: + continue + exit_choice = self.random.choice(possible_exits) + all_exits_copy.remove(exit_choice) + all_destinations_copy.remove(exit_room) + + destination = self.random.choice(all_destinations_copy) + all_destinations_copy.remove(destination) + + er_layout[exit_choice] = destination + + possible_reverse_exits = [exit for exit in room_to_exits_map[destination] if exit in all_exits_copy] + reverse_exit = self.random.choice(possible_reverse_exits) + + er_layout[reverse_exit] = exit_room + + all_exits_copy.remove(reverse_exit) + + return er_layout diff --git a/worlds/sa2b/docs/setup_en.md b/worlds/sa2b/docs/setup_en.md index b30255ad73b2..2ac00a3fb834 100644 --- a/worlds/sa2b/docs/setup_en.md +++ b/worlds/sa2b/docs/setup_en.md @@ -127,9 +127,6 @@ If you wish to use the `SADX Music` option of the Randomizer, you must own a cop - 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 loader. -- Received Cutscene Traps don't play after beating a level. - - Make sure you don't have the "`Skip Intro`" option enabled in the mod manager. - ## Save File Safeguard (Advanced Option) The mod contains a save file safeguard which associates a savefile to a specific Archipelago seed. By default, save files can only connect to Archipelago servers that match their seed. The safeguard can be disabled in the mod config.ini by setting `IgnoreFileSafety` to true. This is NOT recommended for the standard user as it will allow any save file to connect and send items to the Archipelago server. diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index 177b6436ae56..24ffa8c1add8 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -11,6 +11,7 @@ from .logic import StardewLogic, StardewRule, True_, MAX_MONTHS from .options import StardewValleyOptions, SeasonRandomization, Goal, BundleRandomization, BundlePrice, NumberOfLuckBuffs, NumberOfMovementBuffs, \ BackpackProgression, BuildingProgression, ExcludeGingerIsland +from .presets import sv_options_presets from .regions import create_regions from .rules import set_rules from worlds.generic.Rules import set_rule @@ -34,6 +35,7 @@ class StardewItem(Item): class StardewWebWorld(WebWorld): theme = "dirt" bug_report_page = "https://github.com/agilbert1412/StardewArchipelago/issues/new?labels=bug&title=%5BBug%5D%3A+Brief+Description+of+bug+here" + options_presets = sv_options_presets tutorials = [ Tutorial( diff --git a/worlds/stardew_valley/data/items.csv b/worlds/stardew_valley/data/items.csv index a3d61e8b58e0..3c4ddb84156b 100644 --- a/worlds/stardew_valley/data/items.csv +++ b/worlds/stardew_valley/data/items.csv @@ -1,7 +1,7 @@ id,name,classification,groups,mod_name 0,Joja Cola,filler,TRASH, -15,Rusty Key,progression,MUSEUM, -16,Dwarvish Translation Guide,progression,MUSEUM, +15,Rusty Key,progression,, +16,Dwarvish Translation Guide,progression,, 17,Bridge Repair,progression,COMMUNITY_REWARD, 18,Greenhouse,progression,COMMUNITY_REWARD, 19,Glittering Boulder Removed,progression,COMMUNITY_REWARD, diff --git a/worlds/stardew_valley/items.py b/worlds/stardew_valley/items.py index 2d28b4de43c1..a5a370aa08cd 100644 --- a/worlds/stardew_valley/items.py +++ b/worlds/stardew_valley/items.py @@ -300,15 +300,15 @@ def create_stardrops(item_factory: StardewItemFactory, options: StardewValleyOpt def create_museum_items(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): + items.append(item_factory("Rusty Key")) + items.append(item_factory("Dwarvish Translation Guide")) + items.append(item_factory("Ancient Seeds Recipe")) if options.museumsanity == Museumsanity.option_none: return - items.extend(item_factory(item) for item in ["Magic Rock Candy"] * 5) + items.extend(item_factory(item) for item in ["Magic Rock Candy"] * 10) items.extend(item_factory(item) for item in ["Ancient Seeds"] * 5) items.extend(item_factory(item) for item in ["Traveling Merchant Metal Detector"] * 4) - items.append(item_factory("Ancient Seeds Recipe")) items.append(item_factory("Stardrop")) - items.append(item_factory("Rusty Key")) - items.append(item_factory("Dwarvish Translation Guide")) def create_friendsanity_items(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): diff --git a/worlds/stardew_valley/logic.py b/worlds/stardew_valley/logic.py index 0746bd775242..5a6244cf37ae 100644 --- a/worlds/stardew_valley/logic.py +++ b/worlds/stardew_valley/logic.py @@ -8,7 +8,7 @@ from .data.bundle_data import BundleItem from .data.crops_data import crops_by_name from .data.fish_data import island_fish -from .data.museum_data import all_museum_items, MuseumItem, all_museum_artifacts, dwarf_scrolls, all_museum_minerals +from .data.museum_data import all_museum_items, MuseumItem, all_museum_artifacts, all_museum_minerals from .data.recipe_data import all_cooking_recipes, CookingRecipe, RecipeSource, FriendshipSource, QueenOfSauceSource, \ StarterSource, ShopSource, SkillSource from .data.villagers_data import all_villagers_by_name, Villager @@ -1283,8 +1283,6 @@ def has_year_three(self) -> StardewRule: return self.has_lived_months(8) def can_speak_dwarf(self) -> StardewRule: - if self.options.museumsanity == Museumsanity.option_none: - return And([self.can_donate_museum_item(item) for item in dwarf_scrolls]) return self.received("Dwarvish Translation Guide") def can_donate_museum_item(self, item: MuseumItem) -> StardewRule: @@ -1370,9 +1368,6 @@ def has_lived_months(self, number: int) -> StardewRule: return self.received("Month End", number) def has_rusty_key(self) -> StardewRule: - if self.options.museumsanity == Museumsanity.option_none: - required_donations = 80 # It's 60, but without a metal detector I'd rather overshoot so players don't get screwed by RNG - return self.has([item.name for item in all_museum_items], required_donations) & self.can_reach_region(Region.museum) return self.received(Wallet.rusty_key) def can_win_egg_hunt(self) -> StardewRule: diff --git a/worlds/stardew_valley/options.py b/worlds/stardew_valley/options.py index f462f507d4a3..d85bbf06f6ee 100644 --- a/worlds/stardew_valley/options.py +++ b/worlds/stardew_valley/options.py @@ -7,15 +7,15 @@ class Goal(Choice): """What's your goal with this play-through? - Community Center: The world will be completed once you complete the Community Center. - Grandpa's Evaluation: The world will be completed once 4 candles are lit at Grandpa's Shrine. - Bottom of the Mines: The world will be completed once you reach level 120 in the mineshaft. - Cryptic Note: The world will be completed once you complete the quest "Cryptic Note" where Mr Qi asks you to reach floor 100 in the Skull Cavern. - Master Angler: The world will be completed once you have caught every fish in the game. Pairs well with Fishsanity. - Complete Collection: The world will be completed once you have completed the museum by donating every possible item. Pairs well with Museumsanity. - Full House: The world will be completed once you get married and have two kids. Pairs well with Friendsanity. - Greatest Walnut Hunter: The world will be completed once you find all 130 Golden Walnuts - Perfection: The world will be completed once you attain Perfection, based on the vanilla definition. + Community Center: Complete the Community Center. + Grandpa's Evaluation: Succeed grandpa's evaluation with 4 lit candles. + Bottom of the Mines: Reach level 120 in the mineshaft. + Cryptic Note: Complete the quest "Cryptic Note" where Mr Qi asks you to reach floor 100 in the Skull Cavern. + Master Angler: Catch every fish in the game. Pairs well with Fishsanity. + Complete Collection: Complete the museum by donating every possible item. Pairs well with Museumsanity. + Full House: Get married and have two children. Pairs well with Friendsanity. + Greatest Walnut Hunter: Find all 130 Golden Walnuts + Perfection: Attain Perfection, based on the vanilla definition. """ internal_name = "goal" display_name = "Goal" @@ -50,7 +50,7 @@ def get_option_name(cls, value) -> str: class StartingMoney(SpecialRange): """Amount of gold when arriving at the farm. - Set to -1 or unlimited for infinite money in this playthrough""" + Set to -1 or unlimited for infinite money""" internal_name = "starting_money" display_name = "Starting Gold" range_start = -1 @@ -117,10 +117,10 @@ class BundlePrice(Choice): class EntranceRandomization(Choice): """Should area entrances be randomized? Disabled: No entrance randomization is done - Pelican Town: Only buildings in the main town area are randomized among each other - Non Progression: Only buildings that are always available are randomized with each other - Buildings: All Entrances that Allow you to enter a building using a door are randomized with each other - Chaos: Same as above, but the entrances get reshuffled every single day! + Pelican Town: Only doors in the main town area are randomized with each other + Non Progression: Only entrances that are always available are randomized with each other + Buildings: All Entrances that Allow you to enter a building are randomized with each other + Chaos: Same as "Buildings", but the entrances get reshuffled every single day! """ # Everything: All buildings and areas are randomized with each other # Chaos, same as everything: but the buildings are shuffled again every in-game day. You can't learn it! @@ -144,11 +144,10 @@ class EntranceRandomization(Choice): class SeasonRandomization(Choice): """Should seasons be randomized? - All settings allow you to choose which season you want to play next (from those unlocked) at the end of a season. - Disabled: You will start in Spring with all seasons unlocked. - Randomized: The seasons will be unlocked randomly as Archipelago items. - Randomized Not Winter: The seasons are randomized, but you're guaranteed not to start with winter. - Progressive: You will start in Spring and unlock the seasons in their original order. + Disabled: Start in Spring with all seasons unlocked. + Randomized: Start in a random season and the other 3 must be unlocked randomly. + Randomized Not Winter: Same as randomized, but the start season is guaranteed not to be winter. + Progressive: Start in Spring and unlock the seasons in their original order. """ internal_name = "season_randomization" display_name = "Season Randomization" @@ -163,20 +162,21 @@ 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 - Shuffled: Seeds are unlocked as archipelago item, for each seed there is a location check for growing and harvesting that crop + Shuffled: Seeds are unlocked as archipelago items, for each seed there is a location check for growing and harvesting that crop """ internal_name = "cropsanity" display_name = "Cropsanity" default = 1 option_disabled = 0 - option_shuffled = 1 + option_enabled = 1 + alias_shuffled = option_enabled class BackpackProgression(Choice): - """How is the backpack progression handled? - Vanilla: You can buy them at Pierre's General Store. + """Shuffle the backpack? + Vanilla: You can buy backpacks at Pierre's General Store. Progressive: You will randomly find Progressive Backpack upgrades. - Early Progressive: You can expect your first Backpack in sphere 1. + Early Progressive: Same as progressive, but one backpack will be placed early in the multiworld. """ internal_name = "backpack_progression" display_name = "Backpack Progression" @@ -187,8 +187,8 @@ class BackpackProgression(Choice): class ToolProgression(Choice): - """How is the tool progression handled? - Vanilla: Clint will upgrade your tools with ore. + """Shuffle the tool upgrades? + Vanilla: Clint will upgrade your tools with metal bars. Progressive: You will randomly find Progressive Tool upgrades.""" internal_name = "tool_progression" display_name = "Tool Progression" @@ -198,12 +198,11 @@ class ToolProgression(Choice): class ElevatorProgression(Choice): - """How is Elevator progression handled? - Vanilla: You will unlock new elevator floors for yourself. - Progressive: You will randomly find Progressive Mine Elevators to go deeper. Locations are sent for reaching - every elevator level. - Progressive from previous floor: Same as progressive, but you must reach elevator floors on your own, - you cannot use the elevator to check elevator locations""" + """Shuffle the elevator? + Vanilla: Reaching a mineshaft floor unlocks the elevator for it + Progressive: You will randomly find Progressive Mine Elevators to go deeper. + Progressive from previous floor: Same as progressive, but you cannot use the elevator to check elevator locations. + You must reach elevator floors on your own.""" internal_name = "elevator_progression" display_name = "Elevator Progression" default = 2 @@ -213,10 +212,9 @@ class ElevatorProgression(Choice): class SkillProgression(Choice): - """How is the skill progression handled? - Vanilla: You will level up and get the normal reward at each level. - Progressive: The xp will be earned internally, locations will be sent when you earn a level. Your real - levels will be scattered around the multiworld.""" + """Shuffle skill levels? + Vanilla: Leveling up skills is normal + Progressive: Skill levels are unlocked randomly, and earning xp sends checks""" internal_name = "skill_progression" display_name = "Skill Progression" default = 1 @@ -225,11 +223,11 @@ class SkillProgression(Choice): class BuildingProgression(Choice): - """How is the building progression handled? - Vanilla: You will buy each building normally. + """Shuffle Carpenter Buildings? + 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. - Progressive early shipping bin: You can expect your shipping bin in sphere 1. + Progressive early shipping bin: Same as Progressive, but the shipping bin will be placed early in the multiworld. """ internal_name = "building_progression" display_name = "Building Progression" @@ -240,10 +238,10 @@ class BuildingProgression(Choice): class FestivalLocations(Choice): - """Locations for attending and participating in festivals - With Disabled, you do not need to attend festivals - With Easy, there are checks for participating in festivals - With Hard, the festival checks are only granted when the player performs well in the festival + """Shuffle Festival Activities? + Disabled: You do not need to attend festivals + Easy: Every festival has checks, but they are easy and usually only require attendance + Hard: Festivals have more checks, and many require performing well, not just attending """ internal_name = "festival_locations" display_name = "Festival Locations" @@ -254,11 +252,10 @@ class FestivalLocations(Choice): class ArcadeMachineLocations(Choice): - """How are the Arcade Machines handled? - Disabled: The arcade machines are not included in the Archipelago shuffling. + """Shuffle the arcade machines? + Disabled: The arcade machines are not included. Victories: Each Arcade Machine will contain one check on victory - Victories Easy: The arcade machines are both made considerably easier to be more accessible for the average - player. + Victories Easy: Same as Victories, but both games are made considerably easier. Full Shuffling: The arcade machines will contain multiple checks each, and different buffs that make the game easier are in the item pool. Junimo Kart has one check at the end of each level. Journey of the Prairie King has one check after each boss, plus one check for each vendor equipment. @@ -273,10 +270,10 @@ class ArcadeMachineLocations(Choice): class SpecialOrderLocations(Choice): - """How are the Special Orders handled? + """Shuffle Special Orders? Disabled: The special orders are not included in the Archipelago shuffling. Board Only: The Special Orders on the board in town are location checks - Board and Qi: The Special Orders from Qi's walnut room are checks, as well as the board in town + Board and Qi: The Special Orders from Mr Qi's walnut room are checks, in addition to the board in town """ internal_name = "special_order_locations" display_name = "Special Order Locations" @@ -287,7 +284,7 @@ class SpecialOrderLocations(Choice): class HelpWantedLocations(SpecialRange): - """How many "Help Wanted" quests need to be completed as Archipelago Locations + """Include location checks for Help Wanted quests Out of every 7 quests, 4 will be item deliveries, and then 1 of each for: Fishing, Gathering and Slaying Monsters. Choosing a multiple of 7 is recommended.""" internal_name = "help_wanted_locations" @@ -307,7 +304,7 @@ class HelpWantedLocations(SpecialRange): class Fishsanity(Choice): - """Locations for catching fish? + """Locations for catching a fish the first time? None: There are no locations for catching fish Legendaries: Each of the 5 legendary fish are checks Special: A curated selection of strong fish are checks @@ -336,7 +333,7 @@ class Museumsanity(Choice): None: There are no locations for donating artifacts and minerals to the museum Milestones: The donation milestones from the vanilla game are checks Randomized: A random selection of minerals and artifacts are checks - All: Every single donation will be a check + All: Every single donation is a check """ internal_name = "museumsanity" display_name = "Museumsanity" @@ -348,12 +345,12 @@ class Museumsanity(Choice): class Friendsanity(Choice): - """Locations for friendships? - None: There are no checks for befriending villagers - Bachelors: Each heart of a bachelor is a check - Starting NPCs: Each heart for npcs that are immediately available is a check - All: Every heart with every NPC is a check, including Leo, Kent, Sandy, etc - All With Marriage: Marriage candidates must also be dated, married, and befriended up to 14 hearts. + """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 """ internal_name = "friendsanity" display_name = "Friendsanity" @@ -368,7 +365,7 @@ class Friendsanity(Choice): # Conditional Setting - Friendsanity not None class FriendsanityHeartSize(Range): - """If using friendsanity, how many hearts are received per item, and how many hearts must be earned to send a check + """If using friendsanity, how many hearts are received per heart item, and how many hearts must be earned to send a check A higher value will lead to fewer heart items in the item pool, reducing bloat""" internal_name = "friendsanity_heart_size" display_name = "Friendsanity Heart Size" @@ -411,6 +408,7 @@ class ExcludeGingerIsland(Toggle): class TrapItems(Choice): """When rolling filler items, including resource packs, the game can also roll trap items. + Trap items are negative items that cause problems or annoyances for the player This setting is for choosing if traps will be in the item pool, and if so, how punishing they will be. """ internal_name = "trap_items" @@ -441,14 +439,16 @@ class MultipleDaySleepCost(SpecialRange): special_range_names = { "free": 0, - "cheap": 25, - "medium": 50, - "expensive": 100, + "cheap": 10, + "medium": 25, + "expensive": 50, + "very expensive": 100, } class ExperienceMultiplier(SpecialRange): - """How fast you want to earn skill experience. A lower setting mean less experience. + """How fast you want to earn skill experience. + A lower setting mean less experience. A higher setting means more experience.""" internal_name = "experience_multiplier" display_name = "Experience Multiplier" @@ -513,14 +513,15 @@ class QuickStart(Toggle): class Gifting(Toggle): - """Do you want to enable gifting items to and from other Stardew Valley worlds?""" + """Do you want to enable gifting items to and from other Archipelago slots? + Items can only be sent to games that also support gifting""" internal_name = "gifting" display_name = "Gifting" default = 1 class Mods(OptionSet): - """List of mods that will be considered for shuffling.""" + """List of mods that will be included in the shuffling.""" internal_name = "mods" display_name = "Mods" valid_keys = { diff --git a/worlds/stardew_valley/presets.py b/worlds/stardew_valley/presets.py new file mode 100644 index 000000000000..8823c52e5b20 --- /dev/null +++ b/worlds/stardew_valley/presets.py @@ -0,0 +1,323 @@ +from typing import Any, Dict + +from Options import Accessibility, ProgressionBalancing, DeathLink +from .options import Goal, StartingMoney, ProfitMargin, BundleRandomization, BundlePrice, EntranceRandomization, SeasonRandomization, Cropsanity, \ + BackpackProgression, ToolProgression, ElevatorProgression, SkillProgression, BuildingProgression, FestivalLocations, ArcadeMachineLocations, \ + SpecialOrderLocations, HelpWantedLocations, Fishsanity, Museumsanity, Friendsanity, FriendsanityHeartSize, NumberOfMovementBuffs, NumberOfLuckBuffs, \ + ExcludeGingerIsland, TrapItems, MultipleDaySleepEnabled, MultipleDaySleepCost, ExperienceMultiplier, FriendshipMultiplier, DebrisMultiplier, QuickStart, \ + Gifting + +all_random_settings = { + "progression_balancing": "random", + "accessibility": "random", + Goal.internal_name: "random", + StartingMoney.internal_name: "random", + ProfitMargin.internal_name: "random", + BundleRandomization.internal_name: "random", + BundlePrice.internal_name: "random", + EntranceRandomization.internal_name: "random", + SeasonRandomization.internal_name: "random", + Cropsanity.internal_name: "random", + BackpackProgression.internal_name: "random", + ToolProgression.internal_name: "random", + ElevatorProgression.internal_name: "random", + SkillProgression.internal_name: "random", + BuildingProgression.internal_name: "random", + FestivalLocations.internal_name: "random", + ArcadeMachineLocations.internal_name: "random", + SpecialOrderLocations.internal_name: "random", + HelpWantedLocations.internal_name: "random", + Fishsanity.internal_name: "random", + Museumsanity.internal_name: "random", + Friendsanity.internal_name: "random", + FriendsanityHeartSize.internal_name: "random", + NumberOfMovementBuffs.internal_name: "random", + NumberOfLuckBuffs.internal_name: "random", + ExcludeGingerIsland.internal_name: "random", + TrapItems.internal_name: "random", + MultipleDaySleepEnabled.internal_name: "random", + MultipleDaySleepCost.internal_name: "random", + ExperienceMultiplier.internal_name: "random", + FriendshipMultiplier.internal_name: "random", + DebrisMultiplier.internal_name: "random", + QuickStart.internal_name: "random", + Gifting.internal_name: "random", + "death_link": "random", +} + +easy_settings = { + "progression_balancing": ProgressionBalancing.default, + "accessibility": Accessibility.option_items, + Goal.internal_name: Goal.option_community_center, + StartingMoney.internal_name: "very rich", + ProfitMargin.internal_name: "double", + BundleRandomization.internal_name: BundleRandomization.option_thematic, + BundlePrice.internal_name: BundlePrice.option_cheap, + EntranceRandomization.internal_name: EntranceRandomization.option_disabled, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized_not_winter, + Cropsanity.internal_name: Cropsanity.option_enabled, + BackpackProgression.internal_name: BackpackProgression.option_early_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive_early_shipping_bin, + FestivalLocations.internal_name: FestivalLocations.option_easy, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_disabled, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_disabled, + HelpWantedLocations.internal_name: "minimum", + Fishsanity.internal_name: Fishsanity.option_only_easy_fish, + Museumsanity.internal_name: Museumsanity.option_milestones, + Friendsanity.internal_name: Friendsanity.option_none, + FriendsanityHeartSize.internal_name: 4, + NumberOfMovementBuffs.internal_name: 8, + NumberOfLuckBuffs.internal_name: 8, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + TrapItems.internal_name: TrapItems.option_easy, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.option_true, + MultipleDaySleepCost.internal_name: "free", + ExperienceMultiplier.internal_name: "triple", + FriendshipMultiplier.internal_name: "quadruple", + DebrisMultiplier.internal_name: DebrisMultiplier.option_quarter, + QuickStart.internal_name: QuickStart.option_true, + Gifting.internal_name: Gifting.option_true, + "death_link": "false", +} + +medium_settings = { + "progression_balancing": 25, + "accessibility": Accessibility.option_locations, + Goal.internal_name: Goal.option_community_center, + StartingMoney.internal_name: "rich", + ProfitMargin.internal_name: 150, + BundleRandomization.internal_name: BundleRandomization.option_thematic, + BundlePrice.internal_name: BundlePrice.option_normal, + EntranceRandomization.internal_name: EntranceRandomization.option_non_progression, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Cropsanity.internal_name: Cropsanity.option_enabled, + BackpackProgression.internal_name: BackpackProgression.option_early_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive_from_previous_floor, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive_early_shipping_bin, + FestivalLocations.internal_name: FestivalLocations.option_hard, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_victories_easy, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_board_only, + HelpWantedLocations.internal_name: "normal", + Fishsanity.internal_name: Fishsanity.option_exclude_legendaries, + Museumsanity.internal_name: Museumsanity.option_milestones, + Friendsanity.internal_name: Friendsanity.option_starting_npcs, + FriendsanityHeartSize.internal_name: 4, + NumberOfMovementBuffs.internal_name: 6, + NumberOfLuckBuffs.internal_name: 6, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + TrapItems.internal_name: TrapItems.option_medium, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.option_true, + MultipleDaySleepCost.internal_name: "free", + ExperienceMultiplier.internal_name: "double", + FriendshipMultiplier.internal_name: "triple", + DebrisMultiplier.internal_name: DebrisMultiplier.option_half, + QuickStart.internal_name: QuickStart.option_true, + Gifting.internal_name: Gifting.option_true, + "death_link": "false", +} + +hard_settings = { + "progression_balancing": 0, + "accessibility": Accessibility.option_locations, + Goal.internal_name: Goal.option_grandpa_evaluation, + StartingMoney.internal_name: "extra", + ProfitMargin.internal_name: "normal", + BundleRandomization.internal_name: BundleRandomization.option_thematic, + BundlePrice.internal_name: BundlePrice.option_expensive, + EntranceRandomization.internal_name: EntranceRandomization.option_buildings, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Cropsanity.internal_name: Cropsanity.option_enabled, + BackpackProgression.internal_name: BackpackProgression.option_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive_from_previous_floor, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive, + FestivalLocations.internal_name: FestivalLocations.option_hard, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_full_shuffling, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_board_qi, + HelpWantedLocations.internal_name: "lots", + Fishsanity.internal_name: Fishsanity.option_all, + Museumsanity.internal_name: Museumsanity.option_all, + Friendsanity.internal_name: Friendsanity.option_all, + FriendsanityHeartSize.internal_name: 4, + NumberOfMovementBuffs.internal_name: 4, + NumberOfLuckBuffs.internal_name: 4, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, + TrapItems.internal_name: TrapItems.option_hard, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.option_true, + MultipleDaySleepCost.internal_name: "cheap", + ExperienceMultiplier.internal_name: "vanilla", + FriendshipMultiplier.internal_name: "double", + DebrisMultiplier.internal_name: DebrisMultiplier.option_vanilla, + QuickStart.internal_name: QuickStart.option_true, + Gifting.internal_name: Gifting.option_true, + "death_link": "true", +} + +nightmare_settings = { + "progression_balancing": 0, + "accessibility": Accessibility.option_locations, + Goal.internal_name: Goal.option_community_center, + StartingMoney.internal_name: "vanilla", + ProfitMargin.internal_name: "half", + BundleRandomization.internal_name: BundleRandomization.option_shuffled, + BundlePrice.internal_name: BundlePrice.option_expensive, + EntranceRandomization.internal_name: EntranceRandomization.option_buildings, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Cropsanity.internal_name: Cropsanity.option_enabled, + BackpackProgression.internal_name: BackpackProgression.option_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive_from_previous_floor, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive, + FestivalLocations.internal_name: FestivalLocations.option_hard, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_full_shuffling, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_board_qi, + HelpWantedLocations.internal_name: "maximum", + Fishsanity.internal_name: Fishsanity.option_special, + Museumsanity.internal_name: Museumsanity.option_all, + Friendsanity.internal_name: Friendsanity.option_all_with_marriage, + FriendsanityHeartSize.internal_name: 4, + NumberOfMovementBuffs.internal_name: 2, + NumberOfLuckBuffs.internal_name: 2, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, + TrapItems.internal_name: TrapItems.option_hell, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.option_true, + MultipleDaySleepCost.internal_name: "expensive", + ExperienceMultiplier.internal_name: "half", + FriendshipMultiplier.internal_name: "vanilla", + DebrisMultiplier.internal_name: DebrisMultiplier.option_vanilla, + QuickStart.internal_name: QuickStart.option_false, + Gifting.internal_name: Gifting.option_true, + "death_link": "true", +} + +short_settings = { + "progression_balancing": ProgressionBalancing.default, + "accessibility": Accessibility.option_items, + Goal.internal_name: Goal.option_bottom_of_the_mines, + StartingMoney.internal_name: "filthy rich", + ProfitMargin.internal_name: "quadruple", + BundleRandomization.internal_name: BundleRandomization.option_thematic, + BundlePrice.internal_name: BundlePrice.option_very_cheap, + EntranceRandomization.internal_name: EntranceRandomization.option_disabled, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized_not_winter, + Cropsanity.internal_name: Cropsanity.option_disabled, + BackpackProgression.internal_name: BackpackProgression.option_early_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive_from_previous_floor, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive_early_shipping_bin, + FestivalLocations.internal_name: FestivalLocations.option_disabled, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_disabled, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_disabled, + HelpWantedLocations.internal_name: "none", + Fishsanity.internal_name: Fishsanity.option_none, + Museumsanity.internal_name: Museumsanity.option_none, + Friendsanity.internal_name: Friendsanity.option_none, + FriendsanityHeartSize.internal_name: 4, + NumberOfMovementBuffs.internal_name: 10, + NumberOfLuckBuffs.internal_name: 10, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + TrapItems.internal_name: TrapItems.option_easy, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.option_true, + MultipleDaySleepCost.internal_name: "free", + ExperienceMultiplier.internal_name: "quadruple", + FriendshipMultiplier.internal_name: 800, + DebrisMultiplier.internal_name: DebrisMultiplier.option_none, + QuickStart.internal_name: QuickStart.option_true, + Gifting.internal_name: Gifting.option_true, + "death_link": "false", +} + +lowsanity_settings = { + "progression_balancing": ProgressionBalancing.default, + "accessibility": Accessibility.option_minimal, + Goal.internal_name: Goal.default, + StartingMoney.internal_name: StartingMoney.default, + ProfitMargin.internal_name: ProfitMargin.default, + BundleRandomization.internal_name: BundleRandomization.default, + BundlePrice.internal_name: BundlePrice.default, + EntranceRandomization.internal_name: EntranceRandomization.default, + SeasonRandomization.internal_name: SeasonRandomization.option_disabled, + Cropsanity.internal_name: Cropsanity.option_disabled, + BackpackProgression.internal_name: BackpackProgression.option_vanilla, + ToolProgression.internal_name: ToolProgression.option_vanilla, + ElevatorProgression.internal_name: ElevatorProgression.option_vanilla, + SkillProgression.internal_name: SkillProgression.option_vanilla, + BuildingProgression.internal_name: BuildingProgression.option_vanilla, + FestivalLocations.internal_name: FestivalLocations.option_disabled, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_disabled, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_disabled, + HelpWantedLocations.internal_name: "none", + Fishsanity.internal_name: Fishsanity.option_none, + Museumsanity.internal_name: Museumsanity.option_none, + Friendsanity.internal_name: Friendsanity.option_none, + FriendsanityHeartSize.internal_name: FriendsanityHeartSize.default, + NumberOfMovementBuffs.internal_name: NumberOfMovementBuffs.default, + NumberOfLuckBuffs.internal_name: NumberOfLuckBuffs.default, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + TrapItems.internal_name: TrapItems.default, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.default, + MultipleDaySleepCost.internal_name: MultipleDaySleepCost.default, + ExperienceMultiplier.internal_name: ExperienceMultiplier.default, + FriendshipMultiplier.internal_name: FriendshipMultiplier.default, + DebrisMultiplier.internal_name: DebrisMultiplier.default, + QuickStart.internal_name: QuickStart.default, + Gifting.internal_name: Gifting.default, + "death_link": DeathLink.default, +} + +allsanity_settings = { + "progression_balancing": ProgressionBalancing.default, + "accessibility": Accessibility.option_locations, + Goal.internal_name: Goal.default, + StartingMoney.internal_name: StartingMoney.default, + ProfitMargin.internal_name: ProfitMargin.default, + BundleRandomization.internal_name: BundleRandomization.default, + BundlePrice.internal_name: BundlePrice.default, + EntranceRandomization.internal_name: EntranceRandomization.option_buildings, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Cropsanity.internal_name: Cropsanity.option_enabled, + BackpackProgression.internal_name: BackpackProgression.option_early_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive_early_shipping_bin, + FestivalLocations.internal_name: FestivalLocations.option_hard, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_full_shuffling, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_board_qi, + HelpWantedLocations.internal_name: "maximum", + Fishsanity.internal_name: Fishsanity.option_all, + Museumsanity.internal_name: Museumsanity.option_all, + Friendsanity.internal_name: Friendsanity.option_all, + FriendsanityHeartSize.internal_name: 1, + NumberOfMovementBuffs.internal_name: 12, + NumberOfLuckBuffs.internal_name: 12, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, + TrapItems.internal_name: TrapItems.default, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.default, + MultipleDaySleepCost.internal_name: MultipleDaySleepCost.default, + ExperienceMultiplier.internal_name: ExperienceMultiplier.default, + FriendshipMultiplier.internal_name: FriendshipMultiplier.default, + DebrisMultiplier.internal_name: DebrisMultiplier.default, + QuickStart.internal_name: QuickStart.default, + Gifting.internal_name: Gifting.default, + "death_link": DeathLink.default, +} + +sv_options_presets: Dict[str, Dict[str, Any]] = { + "All random": all_random_settings, + "Easy": easy_settings, + "Medium": medium_settings, + "Hard": hard_settings, + "Nightmare": nightmare_settings, + "Short": short_settings, + "Lowsanity": lowsanity_settings, + "Allsanity": allsanity_settings, +} diff --git a/worlds/stardew_valley/test/TestRules.py b/worlds/stardew_valley/test/TestRules.py index 72337812cd80..0749b1a8f153 100644 --- a/worlds/stardew_valley/test/TestRules.py +++ b/worlds/stardew_valley/test/TestRules.py @@ -329,7 +329,7 @@ class TestRecipeLogic(SVTestBase): options = { options.BuildingProgression.internal_name: options.BuildingProgression.option_progressive, options.SkillProgression.internal_name: options.SkillProgression.option_progressive, - options.Cropsanity.internal_name: options.Cropsanity.option_shuffled, + options.Cropsanity.internal_name: options.Cropsanity.option_enabled, } # I wanted to make a test for different ways to obtain a pizza, but I'm stuck not knowing how to block the immediate purchase from Gus diff --git a/worlds/stardew_valley/test/__init__.py b/worlds/stardew_valley/test/__init__.py index b0c4ba2c7bcb..ba037f7a65da 100644 --- a/worlds/stardew_valley/test/__init__.py +++ b/worlds/stardew_valley/test/__init__.py @@ -47,7 +47,7 @@ def run_default_tests(self) -> bool: def minimal_locations_maximal_items(): min_max_options = { SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Cropsanity.internal_name: Cropsanity.option_shuffled, + Cropsanity.internal_name: Cropsanity.option_enabled, BackpackProgression.internal_name: BackpackProgression.option_vanilla, ToolProgression.internal_name: ToolProgression.option_vanilla, SkillProgression.internal_name: SkillProgression.option_vanilla, @@ -72,7 +72,7 @@ def allsanity_options_without_mods(): BundleRandomization.internal_name: BundleRandomization.option_shuffled, BundlePrice.internal_name: BundlePrice.option_expensive, SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Cropsanity.internal_name: Cropsanity.option_shuffled, + Cropsanity.internal_name: Cropsanity.option_enabled, BackpackProgression.internal_name: BackpackProgression.option_progressive, ToolProgression.internal_name: ToolProgression.option_progressive, SkillProgression.internal_name: SkillProgression.option_progressive, diff --git a/worlds/stardew_valley/test/checks/option_checks.py b/worlds/stardew_valley/test/checks/option_checks.py index ce8e552461e3..c9d9860cf52b 100644 --- a/worlds/stardew_valley/test/checks/option_checks.py +++ b/worlds/stardew_valley/test/checks/option_checks.py @@ -40,7 +40,7 @@ def assert_can_reach_island_if_should(tester: SVTestBase, multiworld: MultiWorld def assert_cropsanity_same_number_items_and_locations(tester: SVTestBase, multiworld: MultiWorld): - is_cropsanity = get_stardew_options(multiworld).cropsanity.value == options.Cropsanity.option_shuffled + is_cropsanity = get_stardew_options(multiworld).cropsanity.value == options.Cropsanity.option_enabled if not is_cropsanity: return diff --git a/worlds/undertale/Regions.py b/worlds/undertale/Regions.py index ec13b249fa0e..138a6846537a 100644 --- a/worlds/undertale/Regions.py +++ b/worlds/undertale/Regions.py @@ -24,6 +24,7 @@ def link_undertale_areas(world: MultiWorld, player: int): ("True Lab", []), ("Core", ["Core Exit"]), ("New Home", ["New Home Exit"]), + ("Last Corridor", ["Last Corridor Exit"]), ("Barrier", []), ] @@ -40,7 +41,8 @@ def link_undertale_areas(world: MultiWorld, player: int): ("News Show Entrance", "News Show"), ("Lab Elevator", "True Lab"), ("Core Exit", "New Home"), - ("New Home Exit", "Barrier"), + ("New Home Exit", "Last Corridor"), + ("Last Corridor Exit", "Barrier"), ("Snowdin Hub", "Snowdin Forest"), ("Waterfall Hub", "Waterfall"), ("Hotland Hub", "Hotland"), diff --git a/worlds/undertale/Rules.py b/worlds/undertale/Rules.py index 648152c50414..897484b0508f 100644 --- a/worlds/undertale/Rules.py +++ b/worlds/undertale/Rules.py @@ -81,23 +81,27 @@ def set_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_entrance("New Home Exit", player), lambda state: (state.has("Left Home Key", player) and state.has("Right Home Key", player)) or - state.has("Key Piece", player, state.multiworld.key_pieces[player])) + state.has("Key Piece", player, state.multiworld.key_pieces[player].value)) if _undertale_is_route(multiworld.state, player, 1): set_rule(multiworld.get_entrance("Papyrus\" Home Entrance", player), lambda state: _undertale_has_plot(state, player, "Complete Skeleton")) set_rule(multiworld.get_entrance("Undyne\"s Home Entrance", player), lambda state: _undertale_has_plot(state, player, "Fish") and state.has("Papyrus Date", player)) set_rule(multiworld.get_entrance("Lab Elevator", player), - lambda state: state.has("Alphys Date", player) and _undertale_has_plot(state, player, "DT Extractor")) + lambda state: state.has("Alphys Date", player) and state.has("DT Extractor", player) and + ((state.has("Left Home Key", player) and state.has("Right Home Key", player)) or + state.has("Key Piece", player, state.multiworld.key_pieces[player].value))) set_rule(multiworld.get_location("Alphys Date", player), - lambda state: state.has("Undyne Letter EX", player) and state.has("Undyne Date", player)) + lambda state: state.can_reach("New Home", "Region", player) and state.has("Undyne Letter EX", player) + and state.has("Undyne Date", player)) set_rule(multiworld.get_location("Papyrus Plot", player), lambda state: state.can_reach("Snowdin Town", "Region", player)) set_rule(multiworld.get_location("Undyne Plot", player), lambda state: state.can_reach("Waterfall", "Region", player)) set_rule(multiworld.get_location("True Lab Plot", player), lambda state: state.can_reach("New Home", "Region", player) - and state.can_reach("Letter Quest", "Location", player)) + and state.can_reach("Letter Quest", "Location", player) + and state.can_reach("Alphys Date", "Location", player)) set_rule(multiworld.get_location("Chisps Machine", player), lambda state: state.can_reach("True Lab", "Region", player)) set_rule(multiworld.get_location("Dog Sale 1", player), @@ -113,7 +117,7 @@ def set_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_location("Hush Trade", player), lambda state: state.can_reach("News Show", "Region", player) and state.has("Hot Dog...?", player, 1)) set_rule(multiworld.get_location("Letter Quest", player), - lambda state: state.can_reach("New Home Exit", "Entrance", player) and state.has("Undyne Date", player)) + lambda state: state.can_reach("Last Corridor", "Region", player) and state.has("Undyne Date", player)) if (not _undertale_is_route(multiworld.state, player, 2)) or _undertale_is_route(multiworld.state, player, 3): set_rule(multiworld.get_location("Nicecream Punch Card", player), lambda state: state.has("Punch Card", player, 3) and state.can_reach("Waterfall", "Region", player)) @@ -126,7 +130,7 @@ def set_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_location("Apron Hidden", player), lambda state: state.can_reach("Cooking Show", "Region", player)) if _undertale_is_route(multiworld.state, player, 2) and \ - (multiworld.rando_love[player] or multiworld.rando_stats[player]): + (bool(multiworld.rando_love[player].value) or bool(multiworld.rando_stats[player].value)): maxlv = 1 exp = 190 curarea = "Old Home" @@ -304,7 +308,7 @@ def set_rules(multiworld: MultiWorld, player: int): # Sets rules on completion condition def set_completion_rules(multiworld: MultiWorld, player: int): - completion_requirements = lambda state: state.can_reach("New Home Exit", "Entrance", player) + completion_requirements = lambda state: state.can_reach("Barrier", "Region", player) if _undertale_is_route(multiworld.state, player, 1): completion_requirements = lambda state: state.can_reach("True Lab", "Region", player) diff --git a/worlds/undertale/docs/en_Undertale.md b/worlds/undertale/docs/en_Undertale.md index 87011ee16b4d..7ff5d55edad9 100644 --- a/worlds/undertale/docs/en_Undertale.md +++ b/worlds/undertale/docs/en_Undertale.md @@ -56,8 +56,8 @@ If you press `W` while in the save menu, you will teleport back to the flower ro The following commands are only available when using the UndertaleClient to play with Archipelago. - `/resync` Manually trigger a resync. -- `/patch` Patch the game. -- `/savepath` Redirect to proper save data folder. (Use before connecting!) +- `/savepath` Redirect to proper save data folder. This is necessary for Linux users to use before connecting. - `/auto_patch` Patch the game automatically. -- `/online` Makes you no longer able to see other Undertale players. +- `/patch` Patch the game. Only use this command if `/auto_patch` fails. +- `/online` Toggles seeing other Undertale players. - `/deathlink` Toggles deathlink diff --git a/worlds/wargroove/docs/wargroove_en.md b/worlds/wargroove/docs/wargroove_en.md index 121e8c089083..1954dc013924 100644 --- a/worlds/wargroove/docs/wargroove_en.md +++ b/worlds/wargroove/docs/wargroove_en.md @@ -18,7 +18,7 @@ is strongly recommended in case they become corrupted. 2. Open the `host.yaml` file in your favorite text editor (Notepad will work). 3. Put your Wargroove root directory in the `root_directory:` under the `wargroove_options:` section. - The Wargroove root directory can be found by going to - `Steam->Right Click Wargroove->Properties->Local Files->Browse Local Files` and copying the path in the address bar. + `Steam->Right Click Wargroove->Properties->Installed Files->Browse` and copying the path in the address bar. - Paste the path in between the quotes next to `root_directory:` in the `host.yaml`. - You may have to replace all single \\ with \\\\. 4. Start the Wargroove client. diff --git a/worlds/witness/settings/Disable_Unrandomized.txt b/worlds/witness/settings/Disable_Unrandomized.txt index f7a0fcb7cbd6..3cd7ec1fb5eb 100644 --- a/worlds/witness/settings/Disable_Unrandomized.txt +++ b/worlds/witness/settings/Disable_Unrandomized.txt @@ -9,7 +9,7 @@ Requirement Changes: 0x181B3 - 0x00021 | 0x17D28 | 0x17C71 0x28B39 - True - Reflection 0x17CAB - True - True -0x2779A - True - 0x17CFB | 0x3C12B | 0x17CF7 +0x2779A - 0x17CFB | 0x3C12B | 0x17CF7 Disabled Locations: 0x03505 (Tutorial Gate Close) @@ -125,4 +125,4 @@ Precompleted Locations: 0x035F5 0x000D3 0x33A20 -0x03BE2 \ No newline at end of file +0x03BE2