diff --git a/.gitignore b/.gitignore index f4bcd35c32ae..022abe38fe40 100644 --- a/.gitignore +++ b/.gitignore @@ -9,12 +9,14 @@ *.apmc *.apz5 *.aptloz +*.apemerald *.pyc *.pyd *.sfc *.z64 *.n64 *.nes +*.smc *.sms *.gb *.gbc 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 0952b08a58e7..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 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/Generate.py b/Generate.py index 8113d8a0d7da..74244ec23102 100644 --- a/Generate.py +++ b/Generate.py @@ -127,6 +127,13 @@ def main(args=None, callback=ERmain): player_id += 1 args.multi = max(player_id - 1, args.multi) + + if args.multi == 0: + raise ValueError( + "No individual player files found and number of players is 0. " + "Provide individual player files or specify the number of players via host.yaml or --multi." + ) + logging.info(f"Generating for {args.multi} player{'s' if args.multi > 1 else ''}, " f"{seed_name} Seed {seed} with plando: {args.plando}") diff --git a/Main.py b/Main.py index 7b42a89d12be..568bf0208f78 100644 --- a/Main.py +++ b/Main.py @@ -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 bcbc885b4678..a6a482942efc 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ Currently, the following games are supported: * 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/Utils.py b/Utils.py index bb68602cceb3..5955e924322f 100644 --- a/Utils.py +++ b/Utils.py @@ -47,7 +47,7 @@ def as_simple_string(self) -> str: return ".".join(str(item) for item in self) -__version__ = "0.4.3" +__version__ = "0.4.4" version_tuple = tuplize_version(__version__) is_linux = sys.platform.startswith("linux") 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 55b98df59e42..8a7155afec6b 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 Wings of Liberty": __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 Wings of Liberty"] = render_Starcraft2WingsOfLiberty_tracker diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index 0afc565280f1..83f47235323a 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -95,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/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_items.py b/test/general/test_items.py index 0027a2ec50c7..28a74b5fb87e 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 33f4669bf9fb..429b66d86bb2 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. @@ -463,3 +487,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 df309fbcae75..d7ecd0cec4e6 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/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/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/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/hk/__init__.py b/worlds/hk/__init__.py index c16a108cd169..f7e7e22e69dd 100644 --- a/worlds/hk/__init__.py +++ b/worlds/hk/__init__.py @@ -170,7 +170,6 @@ def generate_early(self): charm_costs = world.RandomCharmCosts[self.player].get_costs(world.random) self.charm_costs = world.PlandoCharmCosts[self.player].get_costs(charm_costs) # world.exclude_locations[self.player].value.update(white_palace_locations) - world.local_items[self.player].value.add("Mimic_Grub") for term, data in cost_terms.items(): mini = getattr(world, f"Minimum{data.option}Price")[self.player] maxi = getattr(world, f"Maximum{data.option}Price")[self.player] 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/ladx/LADXR/generator.py b/worlds/ladx/LADXR/generator.py index 72d631da86a0..0406ad51f890 100644 --- a/worlds/ladx/LADXR/generator.py +++ b/worlds/ladx/LADXR/generator.py @@ -3,6 +3,7 @@ import importlib.machinery import os import pkgutil +from collections import defaultdict from .romTables import ROMWithTables from . import assembler @@ -322,6 +323,22 @@ def gen_hint(): if args.doubletrouble: patches.enemies.doubleTrouble(rom) + if ap_settings["text_shuffle"]: + buckets = defaultdict(list) + # For each ROM bank, shuffle text within the bank + for n, data in enumerate(rom.texts._PointerTable__data): + # Don't muck up which text boxes are questions and which are statements + if type(data) != int and data and data != b'\xFF': + buckets[(rom.texts._PointerTable__banks[n], data[len(data) - 1] == 0xfe)].append((n, data)) + for bucket in buckets.values(): + # For each bucket, make a copy and shuffle + shuffled = bucket.copy() + rnd.shuffle(shuffled) + # Then put new text in + for bucket_idx, (orig_idx, data) in enumerate(bucket): + rom.texts[shuffled[bucket_idx][0]] = data + + if ap_settings["trendy_game"] != TrendyGame.option_normal: # TODO: if 0 or 4, 5, remove inaccurate conveyor tiles diff --git a/worlds/ladx/LADXR/patches/owl.py b/worlds/ladx/LADXR/patches/owl.py index b22386a6cb8f..47e575191a31 100644 --- a/worlds/ladx/LADXR/patches/owl.py +++ b/worlds/ladx/LADXR/patches/owl.py @@ -11,15 +11,17 @@ def removeOwlEvents(rom): re.removeEntities(0x41) re.store(rom) # Clear texts used by the owl. Potentially reused somewhere o else. - rom.texts[0x0D9] = b'\xff' # used by boomerang # 1 Used by empty chest (master stalfos message) # 8 unused (0x0C0-0x0C7) # 1 used by bowwow in chest # 1 used by item for other player message # 2 used by arrow chest messages # 2 used by tunics - for idx in range(0x0BE, 0x0CE): - rom.texts[idx] = b'\xff' + + # Undoing this, we use it for text shuffle now + #rom.texts[0x0D9] = b'\xff' # used by boomerang + # for idx in range(0x0BE, 0x0CE): + # rom.texts[idx] = b'\xff' # Patch the owl entity into a ghost to allow refill of powder/bombs/arrows diff --git a/worlds/ladx/LADXR/patches/phone.py b/worlds/ladx/LADXR/patches/phone.py index f38745606c38..a2f3939a08a1 100644 --- a/worlds/ladx/LADXR/patches/phone.py +++ b/worlds/ladx/LADXR/patches/phone.py @@ -2,34 +2,35 @@ def patchPhone(rom): - rom.texts[0x141] = b"" - rom.texts[0x142] = b"" - rom.texts[0x143] = b"" - rom.texts[0x144] = b"" - rom.texts[0x145] = b"" - rom.texts[0x146] = b"" - rom.texts[0x147] = b"" - rom.texts[0x148] = b"" - rom.texts[0x149] = b"" - rom.texts[0x14A] = b"" - rom.texts[0x14B] = b"" - rom.texts[0x14C] = b"" - rom.texts[0x14D] = b"" - rom.texts[0x14E] = b"" - rom.texts[0x14F] = b"" - rom.texts[0x16E] = b"" - rom.texts[0x1FD] = b"" - rom.texts[0x228] = b"" - rom.texts[0x229] = b"" - rom.texts[0x22A] = b"" - rom.texts[0x240] = b"" - rom.texts[0x241] = b"" - rom.texts[0x242] = b"" - rom.texts[0x243] = b"" - rom.texts[0x244] = b"" - rom.texts[0x245] = b"" - rom.texts[0x247] = b"" - rom.texts[0x248] = b"" + # reenabled for text shuffle +# rom.texts[0x141] = b"" +# rom.texts[0x142] = b"" +# rom.texts[0x143] = b"" +# rom.texts[0x144] = b"" +# rom.texts[0x145] = b"" +# rom.texts[0x146] = b"" +# rom.texts[0x147] = b"" +# rom.texts[0x148] = b"" +# rom.texts[0x149] = b"" +# rom.texts[0x14A] = b"" +# rom.texts[0x14B] = b"" +# rom.texts[0x14C] = b"" +# rom.texts[0x14D] = b"" +# rom.texts[0x14E] = b"" +# rom.texts[0x14F] = b"" +# rom.texts[0x16E] = b"" +# rom.texts[0x1FD] = b"" +# rom.texts[0x228] = b"" +# rom.texts[0x229] = b"" +# rom.texts[0x22A] = b"" +# rom.texts[0x240] = b"" +# rom.texts[0x241] = b"" +# rom.texts[0x242] = b"" +# rom.texts[0x243] = b"" +# rom.texts[0x244] = b"" +# rom.texts[0x245] = b"" +# rom.texts[0x247] = b"" +# rom.texts[0x248] = b"" rom.patch(0x06, 0x2A8F, 0x2BBC, ASM(""" ; We use $DB6D to store which tunics we have. This is normally the Dungeon9 instrument, which does not exist. ld a, [$DC0F] diff --git a/worlds/ladx/LADXR/pointerTable.py b/worlds/ladx/LADXR/pointerTable.py index 9b8d49466c02..a1a92ba1780b 100644 --- a/worlds/ladx/LADXR/pointerTable.py +++ b/worlds/ladx/LADXR/pointerTable.py @@ -116,7 +116,10 @@ def store(self, rom): rom.banks[ptr_bank][ptr_addr] = pointer & 0xFF rom.banks[ptr_bank][ptr_addr + 1] = (pointer >> 8) | 0x40 - for n, s in enumerate(self.__data): + data = list(enumerate(self.__data)) + data.sort(key=lambda t: type(t[1]) == int or -len(t[1])) + + for n, s in data: if isinstance(s, int): pointer = s else: diff --git a/worlds/ladx/Options.py b/worlds/ladx/Options.py index f80ad1552001..f1d5c5130168 100644 --- a/worlds/ladx/Options.py +++ b/worlds/ladx/Options.py @@ -43,6 +43,12 @@ class TradeQuest(DefaultOffToggle, LADXROption): display_name = "Trade Quest" ladxr_name = "tradequest" +class TextShuffle(DefaultOffToggle): + """ + [On] Shuffles all the text in the game + [Off] (default) doesn't shuffle them. + """ + class Rooster(DefaultOnToggle, LADXROption): """ [On] Adds the rooster to the item pool. @@ -431,6 +437,7 @@ class AdditionalWarpPoints(DefaultOffToggle): 'trendy_game': TrendyGame, 'gfxmod': GfxMod, 'palette': Palette, + 'text_shuffle': TextShuffle, 'shuffle_nightmare_keys': ShuffleNightmareKeys, 'shuffle_small_keys': ShuffleSmallKeys, 'shuffle_maps': ShuffleMaps, @@ -439,4 +446,5 @@ class AdditionalWarpPoints(DefaultOffToggle): 'music_change_condition': MusicChangeCondition, 'nag_messages': NagMessages, 'ap_title_screen': APTitleScreen, + } diff --git a/worlds/lingo/LL1.yaml b/worlds/lingo/LL1.yaml index 7ae015dc6432..f8b07b86514b 100644 --- a/worlds/lingo/LL1.yaml +++ b/worlds/lingo/LL1.yaml @@ -97,6 +97,11 @@ # 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: @@ -1645,7 +1650,9 @@ The Observant: True # Assuming that access to The Observant includes access to the right entrance Eight Room: True Eight Alcove: - door: Eight Painting + door: Eight Door + Orange Tower Sixth Floor: + painting: True panels: Achievement: id: Countdown Panels/Panel_incomparable_incomparable @@ -1710,7 +1717,7 @@ colors: blue tag: forbid doors: - Eight Painting: + Eight Door: id: Red Blue Purple Room Area Doors/Door_a_strands location_name: Giant Sevens group: Observant Doors @@ -1720,11 +1727,17 @@ panel: I - room: Elements Area panel: A + paintings: + - id: crown_painting + orientation: east Eight Alcove: entrances: The Incomparable: room: The Incomparable - door: Eight Painting + door: Eight Door + Outside The Initiated: + room: Outside The Initiated + door: Eight Door paintings: - id: eight_painting2 orientation: north @@ -2121,7 +2134,7 @@ orientation: north - id: panda_painting_2 orientation: south - - id: pencil_painting + - id: crown_painting2 orientation: north - id: colors_painting2 orientation: south @@ -2210,6 +2223,7 @@ - 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 @@ -2276,6 +2290,7 @@ paintings: - id: arrows_painting_11 orientation: east + req_blocked_when_no_doors: True # owl hallway in vanilla doors Courtyard: entrances: Roof: True @@ -2631,10 +2646,8 @@ Hub Room: True Outside The Wondrous: True Outside The Undeterred: True - Outside The Initiated: True Outside The Agreeable: True Outside The Wanderer: True - Eight Alcove: True Orange Tower Fifth Floor: room: Orange Tower Fifth Floor door: Welcome Back @@ -2706,6 +2719,8 @@ Orange Tower Fifth Floor: room: Art Gallery door: Exit + Eight Alcove: + door: Eight Door panels: SEVEN (1): id: Backside Room/Panel_seven_seven_5 @@ -2871,6 +2886,16 @@ 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 @@ -5755,11 +5780,13 @@ 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: @@ -6914,6 +6941,7 @@ paintings: - id: clock_painting_3 orientation: east + req_blocked: True # outside the wise (with or without door shuffle) The Red: entrances: Roof: True @@ -7362,6 +7390,7 @@ paintings: - id: hi_solved_painting4 orientation: south + req_blocked_when_no_doors: True # owl hallway in vanilla doors Challenge Room: entrances: Welcome Back Area: diff --git a/worlds/lingo/ids.yaml b/worlds/lingo/ids.yaml index f48858a285f0..1a1ceca24adc 100644 --- a/worlds/lingo/ids.yaml +++ b/worlds/lingo/ids.yaml @@ -1098,7 +1098,7 @@ doors: item: 444474 location: 444569 The Incomparable: - Eight Painting: + Eight Door: item: 444475 location: 445219 Orange Tower: @@ -1219,6 +1219,8 @@ doors: Entrance: item: 444516 location: 445237 + Eight Door: + item: 444578 The Traveled: Color Hallways Entrance: item: 444517 diff --git a/worlds/lingo/player_logic.py b/worlds/lingo/player_logic.py index 217ad91fcd23..abb975e020ae 100644 --- a/worlds/lingo/player_logic.py +++ b/worlds/lingo/player_logic.py @@ -79,12 +79,6 @@ def __init__(self, world: "LingoWorld"): 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 room that represents being able to reach that room. - for room_name in ROOMS.keys(): - roomloc_name = f"{room_name} (Reached)" - self.add_location(room_name, PlayerLocation(roomloc_name, None, [])) - self.EVENT_LOC_TO_ITEM[roomloc_name] = roomloc_name - # 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(): @@ -241,43 +235,46 @@ def randomize_paintings(self, world: "LingoWorld") -> bool: door_shuffle = world.options.shuffle_doors - # Determine the set of exit paintings. All required-exit paintings are included, as are all - # required-when-no-doors paintings if door shuffle is off. We then fill the set with random other paintings. - chosen_exits = [] + # 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: - chosen_exits = [painting_id for painting_id, painting in PAINTINGS.items() - if painting.required_when_no_doors] - chosen_exits += [painting_id for painting_id, painting in PAINTINGS.items() - if painting.exit_only and painting.required] + 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 not painting.required] - chosen_exits += world.random.sample(exitable, PAINTING_EXITS - len(chosen_exits)) + 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 set of entrance paintings. + # 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] - chosen_entrances = world.random.sample(enterable, PAINTING_ENTRANCES) + 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)) - # Create a mapping from entrances to exits. - for warp_exit in chosen_exits: + # 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) - - # Check whether this is a warp from a required painting room to another (or the same) required painting - # room. This could cause a cycle that would make certain regions inaccessible. - warp_exit_room = PAINTINGS[warp_exit].room - warp_enter_room = PAINTINGS[warp_enter].room - - required_painting_rooms = REQUIRED_PAINTING_ROOMS - if door_shuffle == ShuffleDoors.option_none: - required_painting_rooms += REQUIRED_PAINTING_WHEN_NO_DOORS_ROOMS - - if warp_exit_room in required_painting_rooms and warp_enter_room in required_painting_rooms: - # This shuffling is non-workable. Start over. - return False - 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 @@ -292,7 +289,8 @@ def randomize_paintings(self, world: "LingoWorld") -> bool: # 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 == 0)): + 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 index c75cf4956d0b..e5f947de05e4 100644 --- a/worlds/lingo/regions.py +++ b/worlds/lingo/regions.py @@ -43,7 +43,7 @@ def connect_painting(regions: Dict[str, Region], warp_enter: str, warp_exit: str source_region = regions[source_painting.room] source_region.connect( target_region, - f"{source_painting.room} to {target_painting.room} (Painting)", + 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)) @@ -67,10 +67,17 @@ def create_regions(world: "LingoWorld", player_logic: LingoPlayerLogic) -> None: 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], - f"{entrance.room} to {room.name}", - lambda state, r=room, e=entrance: lingo_can_use_entrance(state, r.name, e.door, world.player, player_logic)) + 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) diff --git a/worlds/lingo/rules.py b/worlds/lingo/rules.py index 90c889b7f098..d59b8a1ef78a 100644 --- a/worlds/lingo/rules.py +++ b/worlds/lingo/rules.py @@ -66,7 +66,7 @@ def _lingo_can_solve_panel(state: CollectionState, start_room: str, room: str, p """ Determines whether a panel can be solved """ - if start_room != room and not state.has(f"{room} (Reached)", world.player): + if start_room != room and not state.can_reach(room, "Region", world.player): return False if room == "Second Room" and panel == "ANOTHER TRY" \ @@ -76,7 +76,7 @@ def _lingo_can_solve_panel(state: CollectionState, start_room: str, room: str, p panel_object = PANELS_BY_ROOM[room][panel] for req_room in panel_object.required_rooms: - if not state.has(f"{req_room} (Reached)", world.player): + if not state.can_reach(req_room, "Region", world.player): return False for req_door in panel_object.required_doors: diff --git a/worlds/lingo/static_logic.py b/worlds/lingo/static_logic.py index d122169c5d03..f6690f93a439 100644 --- a/worlds/lingo/static_logic.py +++ b/worlds/lingo/static_logic.py @@ -63,6 +63,8 @@ class Painting(NamedTuple): required_door: Optional[RoomAndDoor] disable: bool move: bool + req_blocked: bool + req_blocked_when_no_doors: bool class Progression(NamedTuple): @@ -471,6 +473,16 @@ def process_painting(room_name, painting_data): 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"] @@ -480,7 +492,8 @@ def process_painting(room_name, painting_data): ) painting_obj = Painting(painting_id, room_name, enter_only, exit_only, orientation, - required_painting, rwnd, required_door, disable_painting, move_painting) + 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) diff --git a/worlds/lingo/utils/validate_config.rb b/worlds/lingo/utils/validate_config.rb index ed2e9058f9ad..bed5188e3163 100644 --- a/worlds/lingo/utils/validate_config.rb +++ b/worlds/lingo/utils/validate_config.rb @@ -42,7 +42,7 @@ 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"] +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 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/mmbn3/docs/setup_en.md b/worlds/mmbn3/docs/setup_en.md index 309c07f5cfc4..b5ff1625c819 100644 --- a/worlds/mmbn3/docs/setup_en.md +++ b/worlds/mmbn3/docs/setup_en.md @@ -12,7 +12,8 @@ As we are using Bizhawk, this guide is only applicable to Windows and Linux syst - Windows users must run the prereq installer first, which can also be found at the above link. - The built-in Archipelago client, which can be installed [here](https://github.com/ArchipelagoMW/Archipelago/releases) (select `MegaMan Battle Network 3 Client` during installation). -- A US MegaMan Battle Network 3 Blue Rom +- A US MegaMan Battle Network 3 Blue Rom. If you have the [MegaMan Battle Network Legacy Collection Vol. 1](https://store.steampowered.com/app/1798010/Mega_Man_Battle_Network_Legacy_Collection_Vol_1/) +on Steam, you can obtain a copy of this ROM from the game's files, see instructions below. ## Configuring Bizhawk @@ -35,6 +36,14 @@ To do so, we simply have to search any GBA rom we happened to own, right click a the list that appears and select the bottom option "Look for another application", then browse to the Bizhawk folder and select EmuHawk.exe. +## Extracting a ROM from the Legacy Collection + +The Steam version of the Legacy Collection contains unmodified GBA ROMs in its files. You can extract these for use with Archipelago. + +1. Open the Legacy Collection Vol. 1's Game Files (Right click on the game in your Library, then open Properties -> Installed Files -> Browse) +2. Open the file `exe/data/exe3b.dat` in a zip-extracting program such as 7-Zip or WinRAR. +3. Extract the file `rom_b_e.srl` somewhere and rename it to `Mega Man Battle Network 3 - Blue Version (USA).gba` + ## Configuring your YAML file ### What is a YAML file and why do I need one? @@ -76,4 +85,4 @@ Don't forget to start manipulating RNG early by shouting during generation: JACK IN! [Your name]! EXECUTE! -``` \ No newline at end of file +``` 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..13c92ddc09bd --- /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["MOVES_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..2dfeee64d8ca --- /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": True, + "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/ror2/Items.py b/worlds/ror2/Items.py deleted file mode 100644 index 448e3272aef8..000000000000 --- a/worlds/ror2/Items.py +++ /dev/null @@ -1,194 +0,0 @@ -from BaseClasses import Item -from .Options import ItemWeights -from .RoR2Environments import * - - -class RiskOfRainItem(Item): - game: str = "Risk of Rain 2" - - -# 37000 - 37699, 38000 -item_table: Dict[str, int] = { - "Dio's Best Friend": 37001, - "Common Item": 37002, - "Uncommon Item": 37003, - "Legendary Item": 37004, - "Boss Item": 37005, - "Lunar Item": 37006, - "Equipment": 37007, - "Item Scrap, White": 37008, - "Item Scrap, Green": 37009, - "Item Scrap, Red": 37010, - "Item Scrap, Yellow": 37011, - "Void Item": 37012, - "Beads of Fealty": 37013 -} - -# 37700 - 37699 -################################################## -# environments - -environment_offest = 37700 - -# add ALL environments into the item table -environment_offset_table = shift_by_offset(environment_ALL_table, environment_offest) -item_table.update(shift_by_offset(environment_ALL_table, environment_offest)) -# use the sotv dlc in the item table so that all names can be looked up regardless of use - -# end of environments -################################################## - -default_weights: Dict[str, int] = { - "Item Scrap, Green": 16, - "Item Scrap, Red": 4, - "Item Scrap, Yellow": 1, - "Item Scrap, White": 32, - "Common Item": 64, - "Uncommon Item": 32, - "Legendary Item": 8, - "Boss Item": 4, - "Lunar Item": 16, - "Void Item": 16, - "Equipment": 32 -} - -new_weights: Dict[str, int] = { - "Item Scrap, Green": 15, - "Item Scrap, Red": 5, - "Item Scrap, Yellow": 1, - "Item Scrap, White": 30, - "Common Item": 75, - "Uncommon Item": 40, - "Legendary Item": 10, - "Boss Item": 5, - "Lunar Item": 10, - "Void Item": 16, - "Equipment": 20 -} - -uncommon_weights: Dict[str, int] = { - "Item Scrap, Green": 45, - "Item Scrap, Red": 5, - "Item Scrap, Yellow": 1, - "Item Scrap, White": 30, - "Common Item": 45, - "Uncommon Item": 100, - "Legendary Item": 10, - "Boss Item": 5, - "Lunar Item": 15, - "Void Item": 16, - "Equipment": 20 -} - -legendary_weights: Dict[str, int] = { - "Item Scrap, Green": 15, - "Item Scrap, Red": 5, - "Item Scrap, Yellow": 1, - "Item Scrap, White": 30, - "Common Item": 50, - "Uncommon Item": 25, - "Legendary Item": 100, - "Boss Item": 5, - "Lunar Item": 15, - "Void Item": 16, - "Equipment": 20 -} - -lunartic_weights: Dict[str, int] = { - "Item Scrap, Green": 0, - "Item Scrap, Red": 0, - "Item Scrap, Yellow": 0, - "Item Scrap, White": 0, - "Common Item": 0, - "Uncommon Item": 0, - "Legendary Item": 0, - "Boss Item": 0, - "Lunar Item": 100, - "Void Item": 0, - "Equipment": 0 -} - -chaos_weights: Dict[str, int] = { - "Item Scrap, Green": 80, - "Item Scrap, Red": 45, - "Item Scrap, Yellow": 30, - "Item Scrap, White": 100, - "Common Item": 100, - "Uncommon Item": 70, - "Legendary Item": 30, - "Boss Item": 20, - "Lunar Item": 60, - "Void Item": 60, - "Equipment": 40 -} - -no_scraps_weights: Dict[str, int] = { - "Item Scrap, Green": 0, - "Item Scrap, Red": 0, - "Item Scrap, Yellow": 0, - "Item Scrap, White": 0, - "Common Item": 100, - "Uncommon Item": 40, - "Legendary Item": 15, - "Boss Item": 5, - "Lunar Item": 10, - "Void Item": 16, - "Equipment": 25 -} - -even_weights: Dict[str, int] = { - "Item Scrap, Green": 1, - "Item Scrap, Red": 1, - "Item Scrap, Yellow": 1, - "Item Scrap, White": 1, - "Common Item": 1, - "Uncommon Item": 1, - "Legendary Item": 1, - "Boss Item": 1, - "Lunar Item": 1, - "Void Item": 1, - "Equipment": 1 -} - -scraps_only: Dict[str, int] = { - "Item Scrap, Green": 70, - "Item Scrap, White": 100, - "Item Scrap, Red": 30, - "Item Scrap, Yellow": 5, - "Common Item": 0, - "Uncommon Item": 0, - "Legendary Item": 0, - "Boss Item": 0, - "Lunar Item": 0, - "Void Item": 0, - "Equipment": 0 -} - -void_weights: Dict[str, int] = { - "Item Scrap, Green": 0, - "Item Scrap, Red": 0, - "Item Scrap, Yellow": 0, - "Item Scrap, White": 0, - "Common Item": 0, - "Uncommon Item": 0, - "Legendary Item": 0, - "Boss Item": 0, - "Lunar Item": 0, - "Void Item": 100, - "Equipment": 0 -} - -item_pool_weights: Dict[int, Dict[str, int]] = { - ItemWeights.option_default: default_weights, - ItemWeights.option_new: new_weights, - ItemWeights.option_uncommon: uncommon_weights, - ItemWeights.option_legendary: legendary_weights, - ItemWeights.option_lunartic: lunartic_weights, - ItemWeights.option_chaos: chaos_weights, - ItemWeights.option_no_scraps: no_scraps_weights, - ItemWeights.option_even: even_weights, - ItemWeights.option_scraps_only: scraps_only, - ItemWeights.option_void: void_weights, -} - -lookup_id_to_name: Dict[int, str] = {id: name for name, id in item_table.items()} diff --git a/worlds/ror2/Locations.py b/worlds/ror2/Locations.py deleted file mode 100644 index 7db3ceca73b3..000000000000 --- a/worlds/ror2/Locations.py +++ /dev/null @@ -1,119 +0,0 @@ -from typing import Tuple -from BaseClasses import Location -from .Options import TotalLocations -from .Options import ChestsPerEnvironment -from .Options import ShrinesPerEnvironment -from .Options import ScavengersPerEnvironment -from .Options import ScannersPerEnvironment -from .Options import AltarsPerEnvironment -from .RoR2Environments import * - - -class RiskOfRainLocation(Location): - game: str = "Risk of Rain 2" - - -ror2_locations_start_id = 38000 - - -def get_classic_item_pickups(n: int) -> Dict[str, int]: - """Get n ItemPickups, capped at the max value for TotalLocations""" - n = max(n, 0) - n = min(n, TotalLocations.range_end) - return { f"ItemPickup{i+1}": ror2_locations_start_id+i for i in range(n) } - - -item_pickups = get_classic_item_pickups(TotalLocations.range_end) -location_table = item_pickups - - -def environment_abreviation(long_name:str) -> str: - """convert long environment names to initials""" - abrev = "" - # go through every word finding a letter (or number) for an initial - for word in long_name.split(): - initial = word[0] - for letter in word: - if letter.isalnum(): - initial = letter - break - abrev+= initial - return abrev - -# highest numbered orderedstages (this is so we can treat the easily caculate the check ids based on the environment and location "offset") -highest_orderedstage: int= max(compress_dict_list_horizontal(environment_orderedstages_table).values()) - -ror2_locations_start_orderedstage = ror2_locations_start_id + TotalLocations.range_end - -class orderedstage_location: - """A class to behave like a struct for storing the offsets of location types in the allocated space per orderedstage environments.""" - # TODO is there a better, more generic way to do this? - offset_ChestsPerEnvironment = 0 - offset_ShrinesPerEnvironment = offset_ChestsPerEnvironment + ChestsPerEnvironment.range_end - offset_ScavengersPerEnvironment = offset_ShrinesPerEnvironment + ShrinesPerEnvironment.range_end - offset_ScannersPerEnvironment = offset_ScavengersPerEnvironment + ScavengersPerEnvironment.range_end - offset_AltarsPerEnvironment = offset_ScannersPerEnvironment + ScannersPerEnvironment.range_end - - # total space allocated to the locations in a single orderedstage environment - allocation = offset_AltarsPerEnvironment + AltarsPerEnvironment.range_end - - def get_environment_locations(chests:int, shrines:int, scavengers:int, scanners:int, altars:int, environment: Tuple[str, int]) -> Dict[str, int]: - """Get the locations within a specific environment""" - environment_name = environment[0] - environment_index = environment[1] - locations = {} - - # due to this mapping, since environment ids are not consecutive, there are lots of "wasted" id numbers - # TODO perhaps a hashing algorithm could be used to compress this range and save "wasted" ids - environment_start_id = environment_index * orderedstage_location.allocation + ror2_locations_start_orderedstage - for n in range(chests): - locations.update({f"{environment_name}: Chest {n+1}": n + orderedstage_location.offset_ChestsPerEnvironment + environment_start_id}) - for n in range(shrines): - locations.update({f"{environment_name}: Shrine {n+1}": n + orderedstage_location.offset_ShrinesPerEnvironment + environment_start_id}) - for n in range(scavengers): - locations.update({f"{environment_name}: Scavenger {n+1}": n + orderedstage_location.offset_ScavengersPerEnvironment + environment_start_id}) - for n in range(scanners): - locations.update({f"{environment_name}: Radio Scanner {n+1}": n + orderedstage_location.offset_ScannersPerEnvironment + environment_start_id}) - for n in range(altars): - locations.update({f"{environment_name}: Newt Altar {n+1}": n + orderedstage_location.offset_AltarsPerEnvironment + environment_start_id}) - return locations - - def get_locations(chests:int, shrines:int, scavengers:int, scanners:int, altars:int, dlc_sotv:bool) -> Dict[str, int]: - """Get a dictionary of locations for the ordedstage environments with the locations from the parameters.""" - locations = {} - orderedstages = compress_dict_list_horizontal(environment_vanilla_orderedstages_table) - if(dlc_sotv): orderedstages.update(compress_dict_list_horizontal(environment_sotv_orderedstages_table)) - # for every environment, generate the respective locations - for environment_name, environment_index in orderedstages.items(): - # locations = locations | orderedstage_location.get_environment_locations( - locations.update(orderedstage_location.get_environment_locations( - chests=chests, - shrines=shrines, - scavengers=scavengers, - scanners=scanners, - altars=altars, - environment=(environment_name, environment_index) - )) - return locations - - def getall_locations(dlc_sotv:bool=True) -> Dict[str, int]: - """ - Get all locations in ordered stages. - Set dlc_sotv to true for the SOTV DLC to be included. - """ - # to get all locations, attempt using as many locations as possible - return orderedstage_location.get_locations( - chests=ChestsPerEnvironment.range_end, - shrines=ShrinesPerEnvironment.range_end, - scavengers=ScavengersPerEnvironment.range_end, - scanners=ScannersPerEnvironment.range_end, - altars=AltarsPerEnvironment.range_end, - dlc_sotv=dlc_sotv - ) - - -ror2_location_post_orderedstage = ror2_locations_start_orderedstage + highest_orderedstage*orderedstage_location.allocation -location_table.update(orderedstage_location.getall_locations()) -# use the sotv dlc in the lookup table so that all ids can be looked up regardless of use - -lookup_id_to_name: Dict[int, str] = {id: name for name, id in location_table.items()} diff --git a/worlds/ror2/RoR2Environments.py b/worlds/ror2/RoR2Environments.py deleted file mode 100644 index 2a9bf73e9805..000000000000 --- a/worlds/ror2/RoR2Environments.py +++ /dev/null @@ -1,118 +0,0 @@ -from typing import Dict, List, TypeVar - -# TODO probably move to Locations - -environment_vanilla_orderedstage_1_table: Dict[str, int] = { - "Distant Roost": 7, # blackbeach - "Distant Roost (2)": 8, # blackbeach2 - "Titanic Plains": 15, # golemplains - "Titanic Plains (2)": 16, # golemplains2 -} -environment_vanilla_orderedstage_2_table: Dict[str, int] = { - "Abandoned Aqueduct": 17, # goolake - "Wetland Aspect": 12, # foggyswamp -} -environment_vanilla_orderedstage_3_table: Dict[str, int] = { - "Rallypoint Delta": 13, # frozenwall - "Scorched Acres": 47, # wispgraveyard -} -environment_vanilla_orderedstage_4_table: Dict[str, int] = { - "Abyssal Depths": 10, # dampcavesimple - "Siren's Call": 37, # shipgraveyard - "Sundered Grove": 35, # rootjungle -} -environment_vanilla_orderedstage_5_table: Dict[str, int] = { - "Sky Meadow": 38, # skymeadow -} - -environment_vanilla_hidden_realm_table: Dict[str, int] = { - "Hidden Realm: Bulwark's Ambry": 5, # artifactworld - "Hidden Realm: Bazaar Between Time": 6, # bazaar - "Hidden Realm: Gilded Coast": 14, # goldshores - "Hidden Realm: A Moment, Whole": 27, # limbo - "Hidden Realm: A Moment, Fractured": 33, # mysteryspace -} - -environment_vanilla_special_table: Dict[str, int] = { - "Void Fields": 4, # arena - "Commencement": 32, # moon2 -} - -environment_sotv_orderedstage_1_table: Dict[str, int] = { - "Siphoned Forest": 39, # snowyforest -} -environment_sotv_orderedstage_2_table: Dict[str, int] = { - "Aphelian Sanctuary": 3, # ancientloft -} -environment_sotv_orderedstage_3_table: Dict[str, int] = { - "Sulfur Pools": 41, # sulfurpools -} -environment_sotv_orderedstage_4_table: Dict[str, int] = { } -environment_sotv_orderedstage_5_table: Dict[str, int] = { } - -# TODO idk much and idc much about simulacrum, is there a forced order or something? -environment_sotv_simulacrum_table: Dict[str, int] = { - "The Simulacrum (Aphelian Sanctuary)": 20, # itancientloft - "The Simulacrum (Abyssal Depths)": 21, # itdampcave - "The Simulacrum (Rallypoint Delta)": 22, # itfrozenwall - "The Simulacrum (Titanic Plains)": 23, # itgolemplains - "The Simulacrum (Abandoned Aqueduct)": 24, # itgoolake - "The Simulacrum (Commencement)": 25, # itmoon - "The Simulacrum (Sky Meadow)": 26, # itskymeadow -} - -environment_sotv_special_table: Dict[str, int] = { - "Void Locus": 46, # voidstage - "The Planetarium": 45, # voidraid -} - -X = TypeVar("X") -Y = TypeVar("Y") - - -def compress_dict_list_horizontal(list_of_dict: List[Dict[X, Y]]) -> Dict[X, Y]: - """Combine all dictionaries in a list together into one dictionary.""" - compressed: Dict[X,Y] = {} - for individual in list_of_dict: compressed.update(individual) - return compressed - -def collapse_dict_list_vertical(list_of_dict1: List[Dict[X, Y]], *args: List[Dict[X, Y]]) -> List[Dict[X, Y]]: - """Combine all parallel dictionaries in lists together to make a new list of dictionaries of the same length.""" - # find the length of the longest list - length = len(list_of_dict1) - for list_of_dictN in args: - length = max(length, len(list_of_dictN)) - - # create a combined list with a length the same as the longest list - collapsed = [{}] * (length) - # The reason the list_of_dict1 is not directly used to make collapsed is - # side effects can occur if all the dictionaries are not manually unioned. - - # merge contents from list_of_dict1 - for i in range(len(list_of_dict1)): - collapsed[i] = {**collapsed[i], **list_of_dict1[i]} - - # merge contents of remaining lists_of_dicts - for list_of_dictN in args: - for i in range(len(list_of_dictN)): - collapsed[i] = {**collapsed[i], **list_of_dictN[i]} - - return collapsed - -# TODO potentially these should only be created when they are directly referenced (unsure of the space/time cost of creating these initially) - -environment_vanilla_orderedstages_table = [ environment_vanilla_orderedstage_1_table, environment_vanilla_orderedstage_2_table, environment_vanilla_orderedstage_3_table, environment_vanilla_orderedstage_4_table, environment_vanilla_orderedstage_5_table ] -environment_vanilla_table = {**compress_dict_list_horizontal(environment_vanilla_orderedstages_table), **environment_vanilla_hidden_realm_table, **environment_vanilla_special_table} - -environment_sotv_orderedstages_table = [ environment_sotv_orderedstage_1_table, environment_sotv_orderedstage_2_table, environment_sotv_orderedstage_3_table, environment_sotv_orderedstage_4_table, environment_sotv_orderedstage_5_table ] -environment_sotv_non_simulacrum_table = {**compress_dict_list_horizontal(environment_sotv_orderedstages_table), **environment_sotv_special_table} -environment_sotv_table = {**environment_sotv_non_simulacrum_table} - -environment_non_orderedstages_table = {**environment_vanilla_hidden_realm_table, **environment_vanilla_special_table, **environment_sotv_simulacrum_table, **environment_sotv_special_table} -environment_orderedstages_table = collapse_dict_list_vertical(environment_vanilla_orderedstages_table, environment_sotv_orderedstages_table) -environment_ALL_table = {**environment_vanilla_table, **environment_sotv_table} - - -def shift_by_offset(dictionary: Dict[str, int], offset:int) -> Dict[str, int]: - """Shift all indexes in a dictionary by an offset""" - return {name:index+offset for name, index in dictionary.items()} diff --git a/worlds/ror2/__init__.py b/worlds/ror2/__init__.py index 22c65dd9deb7..8735ce81fd5d 100644 --- a/worlds/ror2/__init__.py +++ b/worlds/ror2/__init__.py @@ -1,14 +1,16 @@ import string -from .Items import RiskOfRainItem, item_table, item_pool_weights, environment_offest -from .Locations import RiskOfRainLocation, get_classic_item_pickups, item_pickups, orderedstage_location -from .Rules import set_rules -from .RoR2Environments import * - -from BaseClasses import Region, Entrance, Item, ItemClassification, MultiWorld, Tutorial -from .Options import ItemWeights, ROR2Options +from .items import RiskOfRainItem, item_table, item_pool_weights, offset, filler_table, environment_offset +from .locations import RiskOfRainLocation, item_pickups, get_locations +from .rules import set_rules +from .ror2environments import environment_vanilla_table, environment_vanilla_orderedstages_table, \ + environment_sotv_orderedstages_table, environment_sotv_table, collapse_dict_list_vertical, shift_by_offset + +from BaseClasses import Item, ItemClassification, Tutorial +from .options import ItemWeights, ROR2Options from worlds.AutoWorld import World, WebWorld -from .Regions import create_regions +from .regions import create_explore_regions, create_classic_regions +from typing import List, Dict, Any class RiskOfWeb(WebWorld): @@ -18,7 +20,7 @@ class RiskOfWeb(WebWorld): "English", "setup_en.md", "setup/en", - ["Ijwu"] + ["Ijwu", "Kindasneaki"] )] @@ -32,38 +34,53 @@ class RiskOfRainWorld(World): options_dataclass = ROR2Options options: ROR2Options topology_present = False - - item_name_to_id = item_table + item_name_to_id = {name: data.code for name, data in item_table.items()} + item_name_groups = { + "Stages": {name for name, data in item_table.items() if data.category == "Stage"}, + "Environments": {name for name, data in item_table.items() if data.category == "Environment"}, + "Upgrades": {name for name, data in item_table.items() if data.category == "Upgrade"}, + "Fillers": {name for name, data in item_table.items() if data.category == "Filler"}, + "Traps": {name for name, data in item_table.items() if data.category == "Trap"}, + } location_name_to_id = item_pickups - data_version = 7 - required_client_version = (0, 4, 2) + data_version = 8 + required_client_version = (0, 4, 4) web = RiskOfWeb() total_revivals: int - def __init__(self, multiworld: "MultiWorld", player: int): - super().__init__(multiworld, player) - self.junk_pool: Dict[str, int] = {} - def generate_early(self) -> None: # figure out how many revivals should exist in the pool if self.options.goal == "classic": total_locations = self.options.total_locations.value else: total_locations = len( - orderedstage_location.get_locations( + get_locations( chests=self.options.chests_per_stage.value, shrines=self.options.shrines_per_stage.value, scavengers=self.options.scavengers_per_stage.value, scanners=self.options.scanner_per_stage.value, altars=self.options.altars_per_stage.value, - dlc_sotv=self.options.dlc_sotv.value + dlc_sotv=bool(self.options.dlc_sotv.value) ) ) self.total_revivals = int(self.options.total_revivals.value / 100 * total_locations) if self.options.start_with_revive: self.total_revivals -= 1 + if self.options.victory == "voidling" and not self.options.dlc_sotv: + self.options.victory.value = self.options.victory.option_any + + def create_regions(self) -> None: + + if self.options.goal == "classic": + # classic mode + create_classic_regions(self) + else: + # explore mode + create_explore_regions(self) + + self.create_events() def create_items(self) -> None: # shortcut for starting_inventory... The start_with_revive option lets you start with a Dio's Best Friend @@ -77,25 +94,26 @@ def create_items(self) -> None: # figure out all available ordered stages for each tier environment_available_orderedstages_table = environment_vanilla_orderedstages_table if self.options.dlc_sotv: - environment_available_orderedstages_table = collapse_dict_list_vertical(environment_available_orderedstages_table, environment_sotv_orderedstages_table) + environment_available_orderedstages_table = \ + collapse_dict_list_vertical(environment_available_orderedstages_table, + environment_sotv_orderedstages_table) - environments_pool = shift_by_offset(environment_vanilla_table, environment_offest) + environments_pool = shift_by_offset(environment_vanilla_table, environment_offset) if self.options.dlc_sotv: - environment_offset_table = shift_by_offset(environment_sotv_table, environment_offest) + environment_offset_table = shift_by_offset(environment_sotv_table, environment_offset) environments_pool = {**environments_pool, **environment_offset_table} environments_to_precollect = 5 if self.options.begin_with_loop else 1 # percollect environments for each stage (or just stage 1) for i in range(environments_to_precollect): - unlock = self.multiworld.random.choices(list(environment_available_orderedstages_table[i].keys()), k=1) + unlock = self.random.choices(list(environment_available_orderedstages_table[i].keys()), k=1) self.multiworld.push_precollected(self.create_item(unlock[0])) environments_pool.pop(unlock[0]) # Generate item pool - itempool: List = [] + itempool: List[str] = ["Beads of Fealty", "Radar Scanner"] # Add revive items for the player itempool += ["Dio's Best Friend"] * self.total_revivals - itempool += ["Beads of Fealty"] for env_name, _ in environments_pool.items(): itempool += [env_name] @@ -105,38 +123,28 @@ def create_items(self) -> None: total_locations = self.options.total_locations.value else: # explore mode + # Add Stage items for logic gates + itempool += ["Stage 1", "Stage 2", "Stage 3", "Stage 4"] total_locations = len( - orderedstage_location.get_locations( + get_locations( chests=self.options.chests_per_stage.value, shrines=self.options.shrines_per_stage.value, scavengers=self.options.scavengers_per_stage.value, scanners=self.options.scanner_per_stage.value, altars=self.options.altars_per_stage.value, - dlc_sotv=self.options.dlc_sotv.value + dlc_sotv=bool(self.options.dlc_sotv.value) ) ) # Create junk items - self.junk_pool = self.create_junk_pool() + junk_pool = self.create_junk_pool() # Fill remaining items with randomly generated junk - while len(itempool) < total_locations: - itempool.append(self.get_filler_item_name()) + filler = self.random.choices(*zip(*junk_pool.items()), k=total_locations - len(itempool)) + itempool.extend(filler) # Convert itempool into real items - itempool = list(map(lambda name: self.create_item(name), itempool)) - self.multiworld.itempool += itempool + self.multiworld.itempool += map(self.create_item, itempool) - def set_rules(self) -> None: - set_rules(self.multiworld, self.player) - - def get_filler_item_name(self) -> str: - if not self.junk_pool: - self.junk_pool = self.create_junk_pool() - weights = [data for data in self.junk_pool.values()] - filler = self.multiworld.random.choices([filler for filler in self.junk_pool.keys()], weights, - k=1)[0] - return filler - - def create_junk_pool(self) -> Dict: + def create_junk_pool(self) -> Dict[str, int]: # if presets are enabled generate junk_pool from the selected preset pool_option = self.options.item_weights.value junk_pool: Dict[str, int] = {} @@ -144,7 +152,7 @@ def create_junk_pool(self) -> Dict: # generate chaos weights if the preset is chosen if pool_option == ItemWeights.option_chaos: for name, max_value in item_pool_weights[pool_option].items(): - junk_pool[name] = self.multiworld.random.randint(0, max_value) + junk_pool[name] = self.random.randint(0, max_value) else: junk_pool = item_pool_weights[pool_option].copy() else: # generate junk pool from user created presets @@ -159,10 +167,22 @@ def create_junk_pool(self) -> Dict: "Boss Item": self.options.boss_item.value, "Lunar Item": self.options.lunar_item.value, "Void Item": self.options.void_item.value, - "Equipment": self.options.equipment.value + "Equipment": self.options.equipment.value, + "Money": self.options.money.value, + "Lunar Coin": self.options.lunar_coin.value, + "1000 Exp": self.options.experience.value, + "Mountain Trap": self.options.mountain_trap.value, + "Time Warp Trap": self.options.time_warp_trap.value, + "Combat Trap": self.options.combat_trap.value, + "Teleport Trap": self.options.teleport_trap.value, } - - # remove lunar items from the pool if they're disabled in the yaml unless lunartic is rolled + # remove trap items from the pool (excluding lunar items) + if not self.options.enable_trap: + junk_pool.pop("Mountain Trap") + junk_pool.pop("Time Warp Trap") + junk_pool.pop("Combat Trap") + junk_pool.pop("Teleport Trap") + # remove lunar items from the pool if not (self.options.enable_lunar or pool_option == ItemWeights.option_lunartic): junk_pool.pop("Lunar Item") # remove void items from the pool @@ -171,98 +191,58 @@ def create_junk_pool(self) -> Dict: return junk_pool - def create_regions(self) -> None: - - if self.options.goal == "classic": - # classic mode - menu = create_region(self.multiworld, self.player, "Menu") - self.multiworld.regions.append(menu) - # By using a victory region, we can define it as being connected to by several regions - # which can then determine the availability of the victory. - victory_region = create_region(self.multiworld, self.player, "Victory") - self.multiworld.regions.append(victory_region) - petrichor = create_region(self.multiworld, self.player, "Petrichor V", - get_classic_item_pickups(self.options.total_locations.value)) - self.multiworld.regions.append(petrichor) - - # classic mode can get to victory from the beginning of the game - to_victory = Entrance(self.player, "beating game", petrichor) - petrichor.exits.append(to_victory) - to_victory.connect(victory_region) + def create_item(self, name: str) -> Item: + data = item_table[name] + return RiskOfRainItem(name, data.item_type, data.code, self.player) - connection = Entrance(self.player, "Lobby", menu) - menu.exits.append(connection) - connection.connect(petrichor) - else: - # explore mode - create_regions(self.multiworld, self.player) + def set_rules(self) -> None: + set_rules(self) - create_events(self.multiworld, self.player) + def get_filler_item_name(self) -> str: + weights = [data.weight for data in filler_table.values()] + filler = self.multiworld.random.choices([filler for filler in filler_table.keys()], weights, + k=1)[0] + return filler - def fill_slot_data(self): - options_dict = self.options.as_dict("item_pickup_step", "shrine_use_step", "goal", "total_locations", - "chests_per_stage", "shrines_per_stage", "scavengers_per_stage", - "scanner_per_stage", "altars_per_stage", "total_revivals", "start_with_revive", - "final_stage_death", "death_link", casing="camel") + def fill_slot_data(self) -> Dict[str, Any]: + options_dict = self.options.as_dict("item_pickup_step", "shrine_use_step", "goal", "victory", "total_locations", + "chests_per_stage", "shrines_per_stage", "scavengers_per_stage", + "scanner_per_stage", "altars_per_stage", "total_revivals", + "start_with_revive", "final_stage_death", "death_link", + casing="camel") return { **options_dict, - "seed": "".join(self.multiworld.per_slot_randoms[self.player].choice(string.digits) for _ in range(16)), + "seed": "".join(self.random.choice(string.digits) for _ in range(16)), + "offset": offset } - def create_item(self, name: str) -> Item: - item_id = item_table[name] - classification = ItemClassification.filler - if name in {"Dio's Best Friend", "Beads of Fealty"}: - classification = ItemClassification.progression - elif name in {"Legendary Item", "Boss Item"}: - classification = ItemClassification.useful - elif name == "Lunar Item": - classification = ItemClassification.trap - - # Only check for an item to be a environment unlock if those are known to be in the pool. - # This should shave down comparisons. - - elif name in environment_ALL_table.keys(): - if name in {"Hidden Realm: Bulwark's Ambry", "Hidden Realm: Gilded Coast,"}: - classification = ItemClassification.useful - else: - classification = ItemClassification.progression - - item = RiskOfRainItem(name, classification, item_id, self.player) - return item - - -def create_events(world: MultiWorld, player: int) -> None: - total_locations = world.worlds[player].options.total_locations.value - num_of_events = total_locations // 25 - if total_locations / 25 == num_of_events: - num_of_events -= 1 - world_region = world.get_region("Petrichor V", player) - if world.worlds[player].options.goal == "classic": - # only setup Pickups when using classic_mode - for i in range(num_of_events): - event_loc = RiskOfRainLocation(player, f"Pickup{(i + 1) * 25}", None, world_region) - event_loc.place_locked_item(RiskOfRainItem(f"Pickup{(i + 1) * 25}", ItemClassification.progression, None, player)) - event_loc.access_rule = \ - lambda state, i=i: state.can_reach(f"ItemPickup{((i + 1) * 25) - 1}", "Location", player) - world_region.locations.append(event_loc) - elif world.worlds[player].options.goal == "explore": - for n in range(1, 6): - - event_region = world.get_region(f"OrderedStage_{n}", player) - event_loc = RiskOfRainLocation(player, f"Stage_{n}", None, event_region) - event_loc.place_locked_item(RiskOfRainItem(f"Stage_{n}", ItemClassification.progression, None, player)) + def create_events(self) -> None: + total_locations = self.options.total_locations.value + num_of_events = total_locations // 25 + if total_locations / 25 == num_of_events: + num_of_events -= 1 + world_region = self.multiworld.get_region("Petrichor V", self.player) + if self.options.goal == "classic": + # classic mode + # only setup Pickups when using classic_mode + for i in range(num_of_events): + event_loc = RiskOfRainLocation(self.player, f"Pickup{(i + 1) * 25}", None, world_region) + event_loc.place_locked_item( + RiskOfRainItem(f"Pickup{(i + 1) * 25}", ItemClassification.progression, None, + self.player)) + event_loc.access_rule = \ + lambda state, i=i: state.can_reach(f"ItemPickup{((i + 1) * 25) - 1}", "Location", self.player) + world_region.locations.append(event_loc) + else: + # explore mode + event_region = self.multiworld.get_region("OrderedStage_5", self.player) + event_loc = RiskOfRainLocation(self.player, "Stage 5", None, event_region) + event_loc.place_locked_item(RiskOfRainItem("Stage 5", ItemClassification.progression, None, self.player)) event_loc.show_in_spoiler = False event_region.locations.append(event_loc) + event_loc.access_rule = lambda state: state.has("Sky Meadow", self.player) - victory_region = world.get_region("Victory", player) - victory_event = RiskOfRainLocation(player, "Victory", None, victory_region) - victory_event.place_locked_item(RiskOfRainItem("Victory", ItemClassification.progression, None, player)) - world_region.locations.append(victory_event) - - -def create_region(world: MultiWorld, player: int, name: str, locations: Dict[str, int] = {}) -> Region: - ret = Region(name, player, world) - for location_name, location_id in locations.items(): - ret.locations.append(RiskOfRainLocation(player, location_name, location_id, ret)) - return ret + victory_region = self.multiworld.get_region("Victory", self.player) + victory_event = RiskOfRainLocation(self.player, "Victory", None, victory_region) + victory_event.place_locked_item(RiskOfRainItem("Victory", ItemClassification.progression, None, self.player)) + victory_region.locations.append(victory_event) diff --git a/worlds/ror2/docs/setup_en.md b/worlds/ror2/docs/setup_en.md index 4e59d2bf4157..0fa99c071b9c 100644 --- a/worlds/ror2/docs/setup_en.md +++ b/worlds/ror2/docs/setup_en.md @@ -55,4 +55,15 @@ the player's YAML. You can talk to other in the multiworld chat using the RoR2 chat. All other multiworld remote commands list in the [commands guide](/tutorial/Archipelago/commands/en) work as well in the RoR2 chat. You can also optionally connect to the multiworld using the text client, which can be found in the -[main Archipelago installation](https://github.com/ArchipelagoMW/Archipelago/releases). \ No newline at end of file +[main Archipelago installation](https://github.com/ArchipelagoMW/Archipelago/releases). + +### In-Game Commands +These commands are to be used in-game by using ``Ctrl + Alt + ` `` and then typing the following: + - `archipelago_connect [password]` example: "archipelago_connect archipelago.gg 38281 SlotName". + - `archipelago_deathlink true/false` Toggle deathlink. + - `archipelago_disconnect` Disconnect from AP. + - `archipelago_final_stage_death true/false` Toggle final stage death. + +Explore Mode only + - `archipelago_show_unlocked_stages` Show which stages have been received. + - `archipelago_highlight_satellite true/false` This will highlight the satellite to make it easier to see (Default false). \ No newline at end of file diff --git a/worlds/ror2/items.py b/worlds/ror2/items.py new file mode 100644 index 000000000000..449686d04bf0 --- /dev/null +++ b/worlds/ror2/items.py @@ -0,0 +1,309 @@ +from BaseClasses import Item, ItemClassification +from .options import ItemWeights +from .ror2environments import environment_all_table +from typing import NamedTuple, Optional, Dict + + +class RiskOfRainItem(Item): + game: str = "Risk of Rain 2" + + +class RiskOfRainItemData(NamedTuple): + category: str + code: int + item_type: ItemClassification = ItemClassification.filler + weight: Optional[int] = None + + +offset: int = 37000 +filler_offset: int = offset + 300 +trap_offset: int = offset + 400 +stage_offset: int = offset + 500 +environment_offset: int = offset + 700 +# Upgrade item ids 37002 - 37012 +upgrade_table: Dict[str, RiskOfRainItemData] = { + "Common Item": RiskOfRainItemData("Upgrade", 2 + offset, ItemClassification.filler, 64), + "Uncommon Item": RiskOfRainItemData("Upgrade", 3 + offset, ItemClassification.filler, 32), + "Legendary Item": RiskOfRainItemData("Upgrade", 4 + offset, ItemClassification.useful, 8), + "Boss Item": RiskOfRainItemData("Upgrade", 5 + offset, ItemClassification.useful, 4), + "Equipment": RiskOfRainItemData("Upgrade", 7 + offset, ItemClassification.filler, 32), + "Item Scrap, White": RiskOfRainItemData("Upgrade", 8 + offset, ItemClassification.filler, 32), + "Item Scrap, Green": RiskOfRainItemData("Upgrade", 9 + offset, ItemClassification.filler, 16), + "Item Scrap, Red": RiskOfRainItemData("Upgrade", 10 + offset, ItemClassification.filler, 4), + "Item Scrap, Yellow": RiskOfRainItemData("Upgrade", 11 + offset, ItemClassification.filler, 1), + "Void Item": RiskOfRainItemData("Upgrade", 12 + offset, ItemClassification.filler, 16), +} +# Other item ids 37001, 37013-37014 +other_table: Dict[str, RiskOfRainItemData] = { + "Dio's Best Friend": RiskOfRainItemData("ExtraLife", 1 + offset, ItemClassification.progression_skip_balancing), + "Beads of Fealty": RiskOfRainItemData("Beads", 13 + offset, ItemClassification.progression), + "Radar Scanner": RiskOfRainItemData("Radar", 14 + offset, ItemClassification.useful), +} +# Filler item ids 37301 - 37303 +filler_table: Dict[str, RiskOfRainItemData] = { + "Money": RiskOfRainItemData("Filler", 1 + filler_offset, ItemClassification.filler, 64), + "Lunar Coin": RiskOfRainItemData("Filler", 2 + filler_offset, ItemClassification.filler, 20), + "1000 Exp": RiskOfRainItemData("Filler", 3 + filler_offset, ItemClassification.filler, 40), +} +# Trap item ids 37401 - 37404 (Lunar items used to be part of the upgrade item list, so keeping the id the same) +trap_table: Dict[str, RiskOfRainItemData] = { + "Lunar Item": RiskOfRainItemData("Trap", 6 + offset, ItemClassification.trap, 16), + "Mountain Trap": RiskOfRainItemData("Trap", 1 + trap_offset, ItemClassification.trap, 5), + "Time Warp Trap": RiskOfRainItemData("Trap", 2 + trap_offset, ItemClassification.trap, 20), + "Combat Trap": RiskOfRainItemData("Trap", 3 + trap_offset, ItemClassification.trap, 20), + "Teleport Trap": RiskOfRainItemData("Trap", 4 + trap_offset, ItemClassification.trap, 10), +} +# Stage item ids 37501 - 37504 +stage_table: Dict[str, RiskOfRainItemData] = { + "Stage 1": RiskOfRainItemData("Stage", 1 + stage_offset, ItemClassification.progression), + "Stage 2": RiskOfRainItemData("Stage", 2 + stage_offset, ItemClassification.progression), + "Stage 3": RiskOfRainItemData("Stage", 3 + stage_offset, ItemClassification.progression), + "Stage 4": RiskOfRainItemData("Stage", 4 + stage_offset, ItemClassification.progression), + +} + +item_table = {**upgrade_table, **other_table, **filler_table, **trap_table, **stage_table} +# Environment item ids 37700 - 37746 +################################################## +# environments + + +# add ALL environments into the item table +def create_environment_table(name: str, environment_id: int, environment_classification: ItemClassification) \ + -> Dict[str, RiskOfRainItemData]: + return {name: RiskOfRainItemData("Environment", environment_offset + environment_id, environment_classification)} + + +environment_table: Dict[str, RiskOfRainItemData] = {} +# use the sotv dlc in the item table so that all names can be looked up regardless of use +for data, key in environment_all_table.items(): + classification = ItemClassification.progression + if data in {"Hidden Realm: Bulwark's Ambry", "Hidden Realm: Gilded Coast"}: + classification = ItemClassification.useful + environment_table.update(create_environment_table(data, key, classification)) + +item_table.update(environment_table) + +# end of environments +################################################## + +default_weights: Dict[str, int] = { + "Item Scrap, Green": 16, + "Item Scrap, Red": 4, + "Item Scrap, Yellow": 1, + "Item Scrap, White": 32, + "Common Item": 64, + "Uncommon Item": 32, + "Legendary Item": 8, + "Boss Item": 4, + "Void Item": 16, + "Equipment": 32, + "Money": 64, + "Lunar Coin": 20, + "1000 Exp": 40, + "Lunar Item": 10, + "Mountain Trap": 4, + "Time Warp Trap": 20, + "Combat Trap": 20, + "Teleport Trap": 20 +} + +new_weights: Dict[str, int] = { + "Item Scrap, Green": 15, + "Item Scrap, Red": 5, + "Item Scrap, Yellow": 1, + "Item Scrap, White": 30, + "Common Item": 75, + "Uncommon Item": 40, + "Legendary Item": 10, + "Boss Item": 5, + "Void Item": 16, + "Equipment": 20, + "Money": 64, + "Lunar Coin": 20, + "1000 Exp": 40, + "Lunar Item": 10, + "Mountain Trap": 4, + "Time Warp Trap": 20, + "Combat Trap": 20, + "Teleport Trap": 20 +} + +uncommon_weights: Dict[str, int] = { + "Item Scrap, Green": 45, + "Item Scrap, Red": 5, + "Item Scrap, Yellow": 1, + "Item Scrap, White": 30, + "Common Item": 45, + "Uncommon Item": 100, + "Legendary Item": 10, + "Boss Item": 5, + "Void Item": 16, + "Equipment": 20, + "Money": 64, + "Lunar Coin": 20, + "1000 Exp": 40, + "Lunar Item": 10, + "Mountain Trap": 4, + "Time Warp Trap": 20, + "Combat Trap": 20, + "Teleport Trap": 20 +} + +legendary_weights: Dict[str, int] = { + "Item Scrap, Green": 15, + "Item Scrap, Red": 5, + "Item Scrap, Yellow": 1, + "Item Scrap, White": 30, + "Common Item": 50, + "Uncommon Item": 25, + "Legendary Item": 100, + "Boss Item": 5, + "Void Item": 16, + "Equipment": 20, + "Money": 64, + "Lunar Coin": 20, + "1000 Exp": 40, + "Lunar Item": 10, + "Mountain Trap": 4, + "Time Warp Trap": 20, + "Combat Trap": 20, + "Teleport Trap": 20 +} + +chaos_weights: Dict[str, int] = { + "Item Scrap, Green": 80, + "Item Scrap, Red": 45, + "Item Scrap, Yellow": 30, + "Item Scrap, White": 100, + "Common Item": 100, + "Uncommon Item": 70, + "Legendary Item": 30, + "Boss Item": 20, + "Void Item": 60, + "Equipment": 40, + "Money": 64, + "Lunar Coin": 20, + "1000 Exp": 40, + "Lunar Item": 10, + "Mountain Trap": 4, + "Time Warp Trap": 20, + "Combat Trap": 20, + "Teleport Trap": 20 +} + +no_scraps_weights: Dict[str, int] = { + "Item Scrap, Green": 0, + "Item Scrap, Red": 0, + "Item Scrap, Yellow": 0, + "Item Scrap, White": 0, + "Common Item": 100, + "Uncommon Item": 40, + "Legendary Item": 15, + "Boss Item": 5, + "Void Item": 16, + "Equipment": 25, + "Money": 64, + "Lunar Coin": 20, + "1000 Exp": 40, + "Lunar Item": 10, + "Mountain Trap": 4, + "Time Warp Trap": 20, + "Combat Trap": 20, + "Teleport Trap": 20 +} + +even_weights: Dict[str, int] = { + "Item Scrap, Green": 1, + "Item Scrap, Red": 1, + "Item Scrap, Yellow": 1, + "Item Scrap, White": 1, + "Common Item": 1, + "Uncommon Item": 1, + "Legendary Item": 1, + "Boss Item": 1, + "Void Item": 1, + "Equipment": 1, + "Money": 1, + "Lunar Coin": 1, + "1000 Exp": 1, + "Lunar Item": 1, + "Mountain Trap": 1, + "Time Warp Trap": 1, + "Combat Trap": 1, + "Teleport Trap": 1 +} + +scraps_only: Dict[str, int] = { + "Item Scrap, Green": 70, + "Item Scrap, White": 100, + "Item Scrap, Red": 30, + "Item Scrap, Yellow": 5, + "Common Item": 0, + "Uncommon Item": 0, + "Legendary Item": 0, + "Boss Item": 0, + "Void Item": 0, + "Equipment": 0, + "Money": 20, + "Lunar Coin": 10, + "1000 Exp": 10, + "Lunar Item": 0, + "Mountain Trap": 5, + "Time Warp Trap": 10, + "Combat Trap": 10, + "Teleport Trap": 10 +} +lunartic_weights: Dict[str, int] = { + "Item Scrap, Green": 0, + "Item Scrap, Red": 0, + "Item Scrap, Yellow": 0, + "Item Scrap, White": 0, + "Common Item": 0, + "Uncommon Item": 0, + "Legendary Item": 0, + "Boss Item": 0, + "Void Item": 0, + "Equipment": 0, + "Money": 20, + "Lunar Coin": 10, + "1000 Exp": 10, + "Lunar Item": 100, + "Mountain Trap": 5, + "Time Warp Trap": 10, + "Combat Trap": 10, + "Teleport Trap": 10 +} +void_weights: Dict[str, int] = { + "Item Scrap, Green": 0, + "Item Scrap, Red": 0, + "Item Scrap, Yellow": 0, + "Item Scrap, White": 0, + "Common Item": 0, + "Uncommon Item": 0, + "Legendary Item": 0, + "Boss Item": 0, + "Void Item": 100, + "Equipment": 0, + "Money": 20, + "Lunar Coin": 10, + "1000 Exp": 10, + "Lunar Item": 0, + "Mountain Trap": 5, + "Time Warp Trap": 10, + "Combat Trap": 10, + "Teleport Trap": 10 +} + +item_pool_weights: Dict[int, Dict[str, int]] = { + ItemWeights.option_default: default_weights, + ItemWeights.option_new: new_weights, + ItemWeights.option_uncommon: uncommon_weights, + ItemWeights.option_legendary: legendary_weights, + ItemWeights.option_chaos: chaos_weights, + ItemWeights.option_no_scraps: no_scraps_weights, + ItemWeights.option_even: even_weights, + ItemWeights.option_scraps_only: scraps_only, + ItemWeights.option_lunartic: lunartic_weights, + ItemWeights.option_void: void_weights, +} diff --git a/worlds/ror2/locations.py b/worlds/ror2/locations.py new file mode 100644 index 000000000000..13077b3e149c --- /dev/null +++ b/worlds/ror2/locations.py @@ -0,0 +1,89 @@ +from typing import Dict +from BaseClasses import Location +from .options import TotalLocations, ChestsPerEnvironment, ShrinesPerEnvironment, ScavengersPerEnvironment, \ + ScannersPerEnvironment, AltarsPerEnvironment +from .ror2environments import compress_dict_list_horizontal, environment_vanilla_orderedstages_table, \ + environment_sotv_orderedstages_table + + +class RiskOfRainLocation(Location): + game: str = "Risk of Rain 2" + + +ror2_locations_start_id = 38000 + + +def get_classic_item_pickups(n: int) -> Dict[str, int]: + """Get n ItemPickups, capped at the max value for TotalLocations""" + n = max(n, 0) + n = min(n, TotalLocations.range_end) + return {f"ItemPickup{i + 1}": ror2_locations_start_id + i for i in range(n)} + + +item_pickups = get_classic_item_pickups(TotalLocations.range_end) +location_table = item_pickups + +# this is so we can easily calculate the environment and location "offset" ids +ror2_locations_start_ordered_stage = ror2_locations_start_id + TotalLocations.range_end + +# TODO is there a better, more generic way to do this? +offset_chests = 0 +offset_shrines = offset_chests + ChestsPerEnvironment.range_end +offset_scavengers = offset_shrines + ShrinesPerEnvironment.range_end +offset_scanners = offset_scavengers + ScavengersPerEnvironment.range_end +offset_altars = offset_scanners + ScannersPerEnvironment.range_end + +# total space allocated to the locations in a single orderedstage environment +allocation = offset_altars + AltarsPerEnvironment.range_end + + +def get_environment_locations(chests: int, shrines: int, scavengers: int, scanners: int, altars: int, + environment_name: str, environment_index: int) -> Dict[str, int]: + """Get the locations within a specific environment""" + locations = {} + + # due to this mapping, since environment ids are not consecutive, there are lots of "wasted" id numbers + environment_start_id = environment_index * allocation + ror2_locations_start_ordered_stage + for n in range(chests): + locations.update({f"{environment_name}: Chest {n + 1}": n + offset_chests + environment_start_id}) + for n in range(shrines): + locations.update({f"{environment_name}: Shrine {n + 1}": n + offset_shrines + environment_start_id}) + for n in range(scavengers): + locations.update({f"{environment_name}: Scavenger {n + 1}": n + offset_scavengers + environment_start_id}) + for n in range(scanners): + locations.update({f"{environment_name}: Radio Scanner {n + 1}": n + offset_scanners + environment_start_id}) + for n in range(altars): + locations.update({f"{environment_name}: Newt Altar {n + 1}": n + offset_altars + environment_start_id}) + return locations + + +def get_locations(chests: int, shrines: int, scavengers: int, scanners: int, altars: int, dlc_sotv: bool) \ + -> Dict[str, int]: + """Get a dictionary of locations for the orderedstage environments with the locations from the parameters.""" + locations = {} + orderedstages = compress_dict_list_horizontal(environment_vanilla_orderedstages_table) + if dlc_sotv: + orderedstages.update(compress_dict_list_horizontal(environment_sotv_orderedstages_table)) + # for every environment, generate the respective locations + for environment_name, environment_index in orderedstages.items(): + locations.update(get_environment_locations( + chests=chests, + shrines=shrines, + scavengers=scavengers, + scanners=scanners, + altars=altars, + environment_name=environment_name, + environment_index=environment_index), + ) + return locations + + +# Get all locations in ordered stages. +location_table.update(get_locations( + chests=ChestsPerEnvironment.range_end, + shrines=ShrinesPerEnvironment.range_end, + scavengers=ScavengersPerEnvironment.range_end, + scanners=ScannersPerEnvironment.range_end, + altars=AltarsPerEnvironment.range_end, + dlc_sotv=True, +)) diff --git a/worlds/ror2/Options.py b/worlds/ror2/options.py similarity index 73% rename from worlds/ror2/Options.py rename to worlds/ror2/options.py index 0ed0a87b17d6..7daf8a844666 100644 --- a/worlds/ror2/Options.py +++ b/worlds/ror2/options.py @@ -4,7 +4,7 @@ # NOTE be aware that since the range of item ids that RoR2 uses is based off of the maximums of checks # Be careful when changing the range_end values not to go into another game's IDs -# NOTE that these changes to range_end must also be reflected in the RoR2 client so it understands the same ids. +# NOTE that these changes to range_end must also be reflected in the RoR2 client, so it understands the same ids. class Goal(Choice): """ @@ -19,6 +19,21 @@ class Goal(Choice): default = 1 +class Victory(Choice): + """ + Mithrix: Defeat Mithrix in Commencement + Voidling: Defeat the Voidling in The Planetarium (DLC required! Will select any if not enabled.) + Limbo: Defeat the Scavenger in Hidden Realm: A Moment, Whole + Any: Any victory in the game will count. See Final Stage Death for additional ways. + """ + display_name = "Victory Condition" + option_any = 0 + option_mithrix = 1 + option_voidling = 2 + option_limbo = 3 + default = 0 + + class TotalLocations(Range): """Classic Mode: Number of location checks which are added to the Risk of Rain playthrough.""" display_name = "Total Locations" @@ -100,6 +115,11 @@ class ShrineUseStep(Range): default = 0 +class AllowTrapItems(Toggle): + """Allows Trap items in the item pool.""" + display_name = "Enable Trap Items" + + class AllowLunarItems(DefaultOnToggle): """Allows Lunar items in the item pool.""" display_name = "Enable Lunar Item Shuffling" @@ -111,10 +131,14 @@ class StartWithRevive(DefaultOnToggle): class FinalStageDeath(Toggle): - """The following will count as a win if set to true: + """The following will count as a win if set to "true", and victory is set to "any": Dying in Commencement. Dying in The Planetarium. - Obliterating yourself""" + Obliterating yourself + If not use the following to tell if final stage death will count: + Victory: mithrix - only dying in Commencement will count. + Victory: voidling - only dying in The Planetarium will count. + Victory: limbo - Obliterating yourself will count.""" display_name = "Final Stage Death is Win" @@ -247,6 +271,76 @@ class Equipment(Range): default = 32 +class Money(Range): + """Weight of money items in the item pool. + + (Ignored unless Item Weight Presets is 'No')""" + display_name = "Money" + range_start = 0 + range_end = 100 + default = 64 + + +class LunarCoin(Range): + """Weight of lunar coin items in the item pool. + + (Ignored unless Item Weight Presets is 'No')""" + display_name = "Lunar Coins" + range_start = 0 + range_end = 100 + default = 20 + + +class Experience(Range): + """Weight of 1000 exp items in the item pool. + + (Ignored unless Item Weight Presets is 'No')""" + display_name = "1000 Exp" + range_start = 0 + range_end = 100 + default = 40 + + +class MountainTrap(Range): + """Weight of mountain trap items in the item pool. + + (Ignored unless Item Weight Presets is 'No')""" + display_name = "Mountain Trap" + range_start = 0 + range_end = 100 + default = 5 + + +class TimeWarpTrap(Range): + """Weight of time warp trap items in the item pool. + + (Ignored unless Item Weight Presets is 'No')""" + display_name = "Time Warp Trap" + range_start = 0 + range_end = 100 + default = 20 + + +class CombatTrap(Range): + """Weight of combat trap items in the item pool. + + (Ignored unless Item Weight Presets is 'No')""" + display_name = "Combat Trap" + range_start = 0 + range_end = 100 + default = 20 + + +class TeleportTrap(Range): + """Weight of teleport trap items in the item pool. + + (Ignored unless Item Weight Presets is 'No')""" + display_name = "Teleport Trap" + range_start = 0 + range_end = 100 + default = 20 + + class ItemPoolPresetToggle(Toggle): """Will use the item weight presets when set to true, otherwise will use the custom set item pool weights.""" display_name = "Use Item Weight Presets" @@ -258,28 +352,30 @@ class ItemWeights(Choice): - New is a test for a potential adjustment to the default weights. - Uncommon puts a large number of uncommon items in the pool. - Legendary puts a large number of legendary items in the pool. - - Lunartic makes everything a lunar item. - - Chaos generates the pool completely at random with rarer items having a slight cap to prevent this option being too easy. + - Chaos generates the pool completely at random with rarer items having a slight cap to prevent this option being + too easy. - No Scraps removes all scrap items from the item pool. - Even generates the item pool with every item having an even weight. - Scraps Only will be only scrap items in the item pool. + - Lunartic makes everything a lunar item. - Void makes everything a void item.""" display_name = "Item Weights" option_default = 0 option_new = 1 option_uncommon = 2 option_legendary = 3 - option_lunartic = 4 - option_chaos = 5 - option_no_scraps = 6 - option_even = 7 - option_scraps_only = 8 + option_chaos = 4 + option_no_scraps = 5 + option_even = 6 + option_scraps_only = 7 + option_lunartic = 8 option_void = 9 @dataclass class ROR2Options(PerGameCommonOptions): goal: Goal + victory: Victory total_locations: TotalLocations chests_per_stage: ChestsPerEnvironment shrines_per_stage: ShrinesPerEnvironment @@ -294,6 +390,7 @@ class ROR2Options(PerGameCommonOptions): death_link: DeathLink item_pickup_step: ItemPickupStep shrine_use_step: ShrineUseStep + enable_trap: AllowTrapItems enable_lunar: AllowLunarItems item_weights: ItemWeights item_pool_presets: ItemPoolPresetToggle @@ -309,3 +406,10 @@ class ROR2Options(PerGameCommonOptions): lunar_item: LunarItem void_item: VoidItem equipment: Equipment + money: Money + lunar_coin: LunarCoin + experience: Experience + mountain_trap: MountainTrap + time_warp_trap: TimeWarpTrap + combat_trap: CombatTrap + teleport_trap: TeleportTrap diff --git a/worlds/ror2/Regions.py b/worlds/ror2/regions.py similarity index 59% rename from worlds/ror2/Regions.py rename to worlds/ror2/regions.py index 94f5aaf71ee8..13b229da9249 100644 --- a/worlds/ror2/Regions.py +++ b/worlds/ror2/regions.py @@ -1,7 +1,10 @@ -from typing import Dict, List, NamedTuple, Optional +from typing import Dict, List, NamedTuple, Optional, TYPE_CHECKING -from BaseClasses import MultiWorld, Region, Entrance -from .Locations import location_table, RiskOfRainLocation +from BaseClasses import Region, Entrance, MultiWorld +from .locations import location_table, RiskOfRainLocation, get_classic_item_pickups + +if TYPE_CHECKING: + from . import RiskOfRainWorld class RoRRegionData(NamedTuple): @@ -9,10 +12,14 @@ class RoRRegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int): +def create_explore_regions(ror2_world: "RiskOfRainWorld") -> None: + player = ror2_world.player + ror2_options = ror2_world.options + multiworld = ror2_world.multiworld # Default Locations non_dlc_regions: Dict[str, RoRRegionData] = { - "Menu": RoRRegionData(None, ["Distant Roost", "Distant Roost (2)", "Titanic Plains", "Titanic Plains (2)"]), + "Menu": RoRRegionData(None, ["Distant Roost", "Distant Roost (2)", + "Titanic Plains", "Titanic Plains (2)"]), "Distant Roost": RoRRegionData([], ["OrderedStage_1"]), "Distant Roost (2)": RoRRegionData([], ["OrderedStage_1"]), "Titanic Plains": RoRRegionData([], ["OrderedStage_1"]), @@ -34,33 +41,36 @@ def create_regions(multiworld: MultiWorld, player: int): } other_regions: Dict[str, RoRRegionData] = { "Commencement": RoRRegionData(None, ["Victory", "Petrichor V"]), - "OrderedStage_5": RoRRegionData(None, ["Hidden Realm: A Moment, Fractured", "Commencement"]), + "OrderedStage_5": RoRRegionData(None, ["Hidden Realm: A Moment, Fractured", + "Commencement"]), "OrderedStage_1": RoRRegionData(None, ["Hidden Realm: Bazaar Between Time", - "Hidden Realm: Gilded Coast", "Abandoned Aqueduct", "Wetland Aspect"]), + "Hidden Realm: Gilded Coast", "Abandoned Aqueduct", + "Wetland Aspect"]), "OrderedStage_2": RoRRegionData(None, ["Rallypoint Delta", "Scorched Acres"]), - "OrderedStage_3": RoRRegionData(None, ["Abyssal Depths", "Siren's Call", "Sundered Grove"]), + "OrderedStage_3": RoRRegionData(None, ["Abyssal Depths", "Siren's Call", + "Sundered Grove"]), "OrderedStage_4": RoRRegionData(None, ["Sky Meadow"]), "Hidden Realm: A Moment, Fractured": RoRRegionData(None, ["Hidden Realm: A Moment, Whole"]), - "Hidden Realm: A Moment, Whole": RoRRegionData(None, ["Victory"]), + "Hidden Realm: A Moment, Whole": RoRRegionData(None, ["Victory", "Petrichor V"]), "Void Fields": RoRRegionData(None, []), "Victory": RoRRegionData(None, None), - "Petrichor V": RoRRegionData(None, ["Victory"]), + "Petrichor V": RoRRegionData(None, []), "Hidden Realm: Bulwark's Ambry": RoRRegionData(None, None), "Hidden Realm: Bazaar Between Time": RoRRegionData(None, ["Void Fields"]), "Hidden Realm: Gilded Coast": RoRRegionData(None, None) } dlc_other_regions: Dict[str, RoRRegionData] = { - "The Planetarium": RoRRegionData(None, ["Victory"]), + "The Planetarium": RoRRegionData(None, ["Victory", "Petrichor V"]), "Void Locus": RoRRegionData(None, ["The Planetarium"]) } # Totals of each item - chests = int(multiworld.chests_per_stage[player]) - shrines = int(multiworld.shrines_per_stage[player]) - scavengers = int(multiworld.scavengers_per_stage[player]) - scanners = int(multiworld.scanner_per_stage[player]) - newt = int(multiworld.altars_per_stage[player]) + chests = int(ror2_options.chests_per_stage) + shrines = int(ror2_options.shrines_per_stage) + scavengers = int(ror2_options.scavengers_per_stage) + scanners = int(ror2_options.scanner_per_stage) + newt = int(ror2_options.altars_per_stage) all_location_regions = {**non_dlc_regions} - if multiworld.dlc_sotv[player]: + if ror2_options.dlc_sotv: all_location_regions = {**non_dlc_regions, **dlc_regions} # Locations @@ -88,23 +98,35 @@ def create_regions(multiworld: MultiWorld, player: int): regions_pool: Dict = {**all_location_regions, **other_regions} # DLC Locations - if multiworld.dlc_sotv[player]: + if ror2_options.dlc_sotv: non_dlc_regions["Menu"].region_exits.append("Siphoned Forest") other_regions["OrderedStage_1"].region_exits.append("Aphelian Sanctuary") other_regions["OrderedStage_2"].region_exits.append("Sulfur Pools") other_regions["Void Fields"].region_exits.append("Void Locus") + other_regions["Commencement"].region_exits.append("The Planetarium") regions_pool: Dict = {**all_location_regions, **other_regions, **dlc_other_regions} + # Check to see if Victory needs to be removed from regions + if ror2_options.victory == "mithrix": + other_regions["Hidden Realm: A Moment, Whole"].region_exits.pop(0) + dlc_other_regions["The Planetarium"].region_exits.pop(0) + elif ror2_options.victory == "voidling": + other_regions["Commencement"].region_exits.pop(0) + other_regions["Hidden Realm: A Moment, Whole"].region_exits.pop(0) + elif ror2_options.victory == "limbo": + other_regions["Commencement"].region_exits.pop(0) + dlc_other_regions["The Planetarium"].region_exits.pop(0) + # Create all the regions for name, data in regions_pool.items(): - multiworld.regions.append(create_region(multiworld, player, name, data)) + multiworld.regions.append(create_explore_region(multiworld, player, name, data)) # Connect all the regions to their exits for name, data in regions_pool.items(): create_connections_in_regions(multiworld, player, name, data) -def create_region(multiworld: MultiWorld, player: int, name: str, data: RoRRegionData): +def create_explore_region(multiworld: MultiWorld, player: int, name: str, data: RoRRegionData) -> Region: region = Region(name, player, multiworld) if data.locations: for location_name in data.locations: @@ -115,7 +137,7 @@ def create_region(multiworld: MultiWorld, player: int, name: str, data: RoRRegio return region -def create_connections_in_regions(multiworld: MultiWorld, player: int, name: str, data: RoRRegionData): +def create_connections_in_regions(multiworld: MultiWorld, player: int, name: str, data: RoRRegionData) -> None: region = multiworld.get_region(name, player) if data.region_exits: for region_exit in data.region_exits: @@ -123,3 +145,34 @@ def create_connections_in_regions(multiworld: MultiWorld, player: int, name: str exit_region = multiworld.get_region(region_exit, player) r_exit_stage.connect(exit_region) region.exits.append(r_exit_stage) + + +def create_classic_regions(ror2_world: "RiskOfRainWorld") -> None: + player = ror2_world.player + ror2_options = ror2_world.options + multiworld = ror2_world.multiworld + menu = create_classic_region(multiworld, player, "Menu") + multiworld.regions.append(menu) + # By using a victory region, we can define it as being connected to by several regions + # which can then determine the availability of the victory. + victory_region = create_classic_region(multiworld, player, "Victory") + multiworld.regions.append(victory_region) + petrichor = create_classic_region(multiworld, player, "Petrichor V", + get_classic_item_pickups(ror2_options.total_locations.value)) + multiworld.regions.append(petrichor) + + # classic mode can get to victory from the beginning of the game + to_victory = Entrance(player, "beating game", petrichor) + petrichor.exits.append(to_victory) + to_victory.connect(victory_region) + + connection = Entrance(player, "Lobby", menu) + menu.exits.append(connection) + connection.connect(petrichor) + + +def create_classic_region(multiworld: MultiWorld, player: int, name: str, locations: Dict[str, int] = {}) -> Region: + ret = Region(name, player, multiworld) + for location_name, location_id in locations.items(): + ret.locations.append(RiskOfRainLocation(player, location_name, location_id, ret)) + return ret diff --git a/worlds/ror2/ror2environments.py b/worlds/ror2/ror2environments.py new file mode 100644 index 000000000000..d821763ef40c --- /dev/null +++ b/worlds/ror2/ror2environments.py @@ -0,0 +1,118 @@ +from typing import Dict, List, TypeVar + +# TODO probably move to Locations + +environment_vanilla_orderedstage_1_table: Dict[str, int] = { + "Distant Roost": 7, # blackbeach + "Distant Roost (2)": 8, # blackbeach2 + "Titanic Plains": 15, # golemplains + "Titanic Plains (2)": 16, # golemplains2 +} +environment_vanilla_orderedstage_2_table: Dict[str, int] = { + "Abandoned Aqueduct": 17, # goolake + "Wetland Aspect": 12, # foggyswamp +} +environment_vanilla_orderedstage_3_table: Dict[str, int] = { + "Rallypoint Delta": 13, # frozenwall + "Scorched Acres": 47, # wispgraveyard +} +environment_vanilla_orderedstage_4_table: Dict[str, int] = { + "Abyssal Depths": 10, # dampcavesimple + "Siren's Call": 37, # shipgraveyard + "Sundered Grove": 35, # rootjungle +} +environment_vanilla_orderedstage_5_table: Dict[str, int] = { + "Sky Meadow": 38, # skymeadow +} + +environment_vanilla_hidden_realm_table: Dict[str, int] = { + "Hidden Realm: Bulwark's Ambry": 5, # artifactworld + "Hidden Realm: Bazaar Between Time": 6, # bazaar + "Hidden Realm: Gilded Coast": 14, # goldshores + "Hidden Realm: A Moment, Whole": 27, # limbo + "Hidden Realm: A Moment, Fractured": 33, # mysteryspace +} + +environment_vanilla_special_table: Dict[str, int] = { + "Void Fields": 4, # arena + "Commencement": 32, # moon2 +} + +environment_sotv_orderedstage_1_table: Dict[str, int] = { + "Siphoned Forest": 39, # snowyforest +} +environment_sotv_orderedstage_2_table: Dict[str, int] = { + "Aphelian Sanctuary": 3, # ancientloft +} +environment_sotv_orderedstage_3_table: Dict[str, int] = { + "Sulfur Pools": 41, # sulfurpools +} + +environment_sotv_special_table: Dict[str, int] = { + "Void Locus": 46, # voidstage + "The Planetarium": 45, # voidraid +} + +X = TypeVar("X") +Y = TypeVar("Y") + + +def compress_dict_list_horizontal(list_of_dict: List[Dict[X, Y]]) -> Dict[X, Y]: + """Combine all dictionaries in a list together into one dictionary.""" + compressed: Dict[X, Y] = {} + for individual in list_of_dict: + compressed.update(individual) + return compressed + + +def collapse_dict_list_vertical(list_of_dict_1: List[Dict[X, Y]], *args: List[Dict[X, Y]]) -> List[Dict[X, Y]]: + """Combine all parallel dictionaries in lists together to make a new list of dictionaries of the same length.""" + # find the length of the longest list + length = len(list_of_dict_1) + for list_of_dict_n in args: + length = max(length, len(list_of_dict_n)) + + # create a combined list with a length the same as the longest list + collapsed: List[Dict[X, Y]] = [{}] * length + # The reason the list_of_dict_1 is not directly used to make collapsed is + # side effects can occur if all the dictionaries are not manually unioned. + + # merge contents from list_of_dict_1 + for i in range(len(list_of_dict_1)): + collapsed[i] = {**collapsed[i], **list_of_dict_1[i]} + + # merge contents of remaining lists_of_dicts + for list_of_dict_n in args: + for i in range(len(list_of_dict_n)): + collapsed[i] = {**collapsed[i], **list_of_dict_n[i]} + + return collapsed + + +# TODO potentially these should only be created when they are directly referenced +# (unsure of the space/time cost of creating these initially) + +environment_vanilla_orderedstages_table = \ + [environment_vanilla_orderedstage_1_table, environment_vanilla_orderedstage_2_table, + environment_vanilla_orderedstage_3_table, environment_vanilla_orderedstage_4_table, + environment_vanilla_orderedstage_5_table] +environment_vanilla_table = \ + {**compress_dict_list_horizontal(environment_vanilla_orderedstages_table), + **environment_vanilla_hidden_realm_table, **environment_vanilla_special_table} + +environment_sotv_orderedstages_table = \ + [environment_sotv_orderedstage_1_table, environment_sotv_orderedstage_2_table, + environment_sotv_orderedstage_3_table] +environment_sotv_table = \ + {**compress_dict_list_horizontal(environment_sotv_orderedstages_table), **environment_sotv_special_table} + +environment_non_orderedstages_table = \ + {**environment_vanilla_hidden_realm_table, **environment_vanilla_special_table, **environment_sotv_special_table} +environment_orderedstages_table = \ + collapse_dict_list_vertical(environment_vanilla_orderedstages_table, environment_sotv_orderedstages_table) +environment_all_table = {**environment_vanilla_table, **environment_sotv_table} + + +def shift_by_offset(dictionary: Dict[str, int], offset: int) -> Dict[str, int]: + """Shift all indexes in a dictionary by an offset""" + return {name: index+offset for name, index in dictionary.items()} diff --git a/worlds/ror2/Rules.py b/worlds/ror2/rules.py similarity index 60% rename from worlds/ror2/Rules.py rename to worlds/ror2/rules.py index 65c04d06cba6..442e6c0002aa 100644 --- a/worlds/ror2/Rules.py +++ b/worlds/ror2/rules.py @@ -1,62 +1,71 @@ -from BaseClasses import MultiWorld, CollectionState from worlds.generic.Rules import set_rule, add_rule -from .Locations import orderedstage_location -from .RoR2Environments import environment_vanilla_orderedstages_table, environment_sotv_orderedstages_table, \ - environment_orderedstages_table +from BaseClasses import MultiWorld +from .locations import get_locations +from .ror2environments import environment_vanilla_orderedstages_table, environment_sotv_orderedstages_table +from typing import Set, TYPE_CHECKING + +if TYPE_CHECKING: + from . import RiskOfRainWorld # Rule to see if it has access to the previous stage -def has_entrance_access_rule(multiworld: MultiWorld, stage: str, entrance: str, player: int): +def has_entrance_access_rule(multiworld: MultiWorld, stage: str, entrance: str, player: int) -> None: multiworld.get_entrance(entrance, player).access_rule = \ lambda state: state.has(entrance, player) and state.has(stage, player) +def has_all_items(multiworld: MultiWorld, items: Set[str], entrance: str, player: int) -> None: + multiworld.get_entrance(entrance, player).access_rule = \ + lambda state: state.has_all(items, player) and state.has(entrance, player) + + # Checks to see if chest/shrine are accessible -def has_location_access_rule(multiworld: MultiWorld, environment: str, player: int, item_number: int, item_type: str): +def has_location_access_rule(multiworld: MultiWorld, environment: str, player: int, item_number: int, item_type: str)\ + -> None: if item_number == 1: multiworld.get_location(f"{environment}: {item_type} {item_number}", player).access_rule = \ lambda state: state.has(environment, player) + # scavengers need to be locked till after a full loop since that is when they are capable of spawning. + # (While technically the requirement is just beating 5 stages, this will ensure that the player will have + # a long enough run to have enough director credits for scavengers and + # help prevent being stuck in the same stages until that point). if item_type == "Scavenger": multiworld.get_location(f"{environment}: {item_type} {item_number}", player).access_rule = \ - lambda state: state.has(environment, player) and state.has("Stage_4", player) + lambda state: state.has(environment, player) and state.has("Stage 5", player) else: multiworld.get_location(f"{environment}: {item_type} {item_number}", player).access_rule = \ lambda state: check_location(state, environment, player, item_number, item_type) -def check_location(state, environment: str, player: int, item_number: int, item_name: str): +def check_location(state, environment: str, player: int, item_number: int, item_name: str) -> bool: return state.can_reach(f"{environment}: {item_name} {item_number - 1}", "Location", player) # unlock event to next set of stages -def get_stage_event(multiworld: MultiWorld, player: int, stage_number: int): - if not multiworld.dlc_sotv[player]: - environment_name = multiworld.random.choices(list(environment_vanilla_orderedstages_table[stage_number].keys()), - k=1) - else: - environment_name = multiworld.random.choices(list(environment_orderedstages_table[stage_number].keys()), k=1) - multiworld.get_location(f"Stage_{stage_number + 1}", player).access_rule = \ - lambda state: get_one_of_the_stages(state, environment_name[0], player) - - -def get_one_of_the_stages(state: CollectionState, stage: str, player: int): - return state.has(stage, player) - - -def set_rules(multiworld: MultiWorld, player: int) -> None: - if multiworld.goal[player] == "classic": +def get_stage_event(multiworld: MultiWorld, player: int, stage_number: int) -> None: + if stage_number == 4: + return + multiworld.get_entrance(f"OrderedStage_{stage_number + 1}", player).access_rule = \ + lambda state: state.has(f"Stage {stage_number + 1}", player) + + +def set_rules(ror2_world: "RiskOfRainWorld") -> None: + player = ror2_world.player + multiworld = ror2_world.multiworld + ror2_options = ror2_world.options + if ror2_options.goal == "classic": # classic mode - total_locations = multiworld.total_locations[player].value # total locations for current player + total_locations = ror2_options.total_locations.value # total locations for current player else: # explore mode total_locations = len( - orderedstage_location.get_locations( - chests=multiworld.chests_per_stage[player].value, - shrines=multiworld.shrines_per_stage[player].value, - scavengers=multiworld.scavengers_per_stage[player].value, - scanners=multiworld.scanner_per_stage[player].value, - altars=multiworld.altars_per_stage[player].value, - dlc_sotv=multiworld.dlc_sotv[player].value + get_locations( + chests=ror2_options.chests_per_stage.value, + shrines=ror2_options.shrines_per_stage.value, + scavengers=ror2_options.scavengers_per_stage.value, + scanners=ror2_options.scanner_per_stage.value, + altars=ror2_options.altars_per_stage.value, + dlc_sotv=bool(ror2_options.dlc_sotv.value) ) ) @@ -64,14 +73,15 @@ def set_rules(multiworld: MultiWorld, player: int) -> None: divisions = total_locations // event_location_step total_revivals = multiworld.worlds[player].total_revivals # pulling this info we calculated in generate_basic - if multiworld.goal[player] == "classic": + if ror2_options.goal == "classic": # classic mode if divisions: for i in range(1, divisions + 1): # since divisions is the floor of total_locations / 25 if i * event_location_step != total_locations: event_loc = multiworld.get_location(f"Pickup{i * event_location_step}", player) set_rule(event_loc, - lambda state, i=i: state.can_reach(f"ItemPickup{i * event_location_step - 1}", "Location", player)) + lambda state, i=i: state.can_reach(f"ItemPickup{i * event_location_step - 1}", + "Location", player)) # we want to create a rule for each of the 25 locations per division for n in range(i * event_location_step, (i + 1) * event_location_step + 1): if n > total_locations: @@ -84,27 +94,18 @@ def set_rules(multiworld: MultiWorld, player: int) -> None: lambda state, n=n: state.can_reach(f"ItemPickup{n - 1}", "Location", player)) set_rule(multiworld.get_location("Victory", player), lambda state: state.can_reach(f"ItemPickup{total_locations}", "Location", player)) - if total_revivals or multiworld.start_with_revive[player].value: + if total_revivals or ror2_options.start_with_revive.value: add_rule(multiworld.get_location("Victory", player), lambda state: state.has("Dio's Best Friend", player, - total_revivals + multiworld.start_with_revive[player])) + total_revivals + ror2_options.start_with_revive)) - elif multiworld.goal[player] == "explore": - # When explore_mode is used, - # scavengers need to be locked till after a full loop since that is when they are capable of spawning. - # (While technically the requirement is just beating 5 stages, this will ensure that the player will have - # a long enough run to have enough director credits for scavengers and - # help prevent being stuck in the same stages until that point.) - - for location in multiworld.get_locations(player): - if "Scavenger" in location.name: - add_rule(location, lambda state: state.has("Stage_5", player)) - # Regions - chests = multiworld.chests_per_stage[player] - shrines = multiworld.shrines_per_stage[player] - newts = multiworld.altars_per_stage[player] - scavengers = multiworld.scavengers_per_stage[player] - scanners = multiworld.scanner_per_stage[player] + else: + # explore mode + chests = ror2_options.chests_per_stage.value + shrines = ror2_options.shrines_per_stage.value + newts = ror2_options.altars_per_stage.value + scavengers = ror2_options.scavengers_per_stage.value + scanners = ror2_options.scanner_per_stage.value for i in range(len(environment_vanilla_orderedstages_table)): for environment_name, _ in environment_vanilla_orderedstages_table[i].items(): # Make sure to go through each location @@ -120,10 +121,10 @@ def set_rules(multiworld: MultiWorld, player: int) -> None: for newt in range(1, newts + 1): has_location_access_rule(multiworld, environment_name, player, newt, "Newt Altar") if i > 0: - has_entrance_access_rule(multiworld, f"Stage_{i}", environment_name, player) + has_entrance_access_rule(multiworld, f"Stage {i}", environment_name, player) get_stage_event(multiworld, player, i) - if multiworld.dlc_sotv[player]: + if ror2_options.dlc_sotv: for i in range(len(environment_sotv_orderedstages_table)): for environment_name, _ in environment_sotv_orderedstages_table[i].items(): # Make sure to go through each location @@ -139,16 +140,19 @@ def set_rules(multiworld: MultiWorld, player: int) -> None: for newt in range(1, newts + 1): has_location_access_rule(multiworld, environment_name, player, newt, "Newt Altar") if i > 0: - has_entrance_access_rule(multiworld, f"Stage_{i}", environment_name, player) - has_entrance_access_rule(multiworld, f"Hidden Realm: A Moment, Fractured", "Hidden Realm: A Moment, Whole", + has_entrance_access_rule(multiworld, f"Stage {i}", environment_name, player) + has_entrance_access_rule(multiworld, "Hidden Realm: A Moment, Fractured", "Hidden Realm: A Moment, Whole", player) - has_entrance_access_rule(multiworld, f"Stage_1", "Hidden Realm: Bazaar Between Time", player) - has_entrance_access_rule(multiworld, f"Hidden Realm: Bazaar Between Time", "Void Fields", player) - has_entrance_access_rule(multiworld, f"Stage_5", "Commencement", player) - has_entrance_access_rule(multiworld, f"Stage_5", "Hidden Realm: A Moment, Fractured", player) + has_entrance_access_rule(multiworld, "Stage 1", "Hidden Realm: Bazaar Between Time", player) + has_entrance_access_rule(multiworld, "Hidden Realm: Bazaar Between Time", "Void Fields", player) + has_entrance_access_rule(multiworld, "Stage 5", "Commencement", player) + has_entrance_access_rule(multiworld, "Stage 5", "Hidden Realm: A Moment, Fractured", player) has_entrance_access_rule(multiworld, "Beads of Fealty", "Hidden Realm: A Moment, Whole", player) - if multiworld.dlc_sotv[player]: - has_entrance_access_rule(multiworld, f"Stage_5", "Void Locus", player) - has_entrance_access_rule(multiworld, f"Void Locus", "The Planetarium", player) + if ror2_options.dlc_sotv: + has_entrance_access_rule(multiworld, "Stage 5", "The Planetarium", player) + has_entrance_access_rule(multiworld, "Stage 5", "Void Locus", player) + if ror2_options.victory == "voidling": + has_all_items(multiworld, {"Stage 5", "The Planetarium"}, "Commencement", player) + # Win Condition multiworld.completion_condition[player] = lambda state: state.has("Victory", player) diff --git a/worlds/ror2/test/__init__.py b/worlds/ror2/test/__init__.py new file mode 100644 index 000000000000..87d8183ab847 --- /dev/null +++ b/worlds/ror2/test/__init__.py @@ -0,0 +1,5 @@ +from test.bases import WorldTestBase + + +class RoR2TestBase(WorldTestBase): + game = "Risk of Rain 2" diff --git a/worlds/ror2/test/test_any_goal.py b/worlds/ror2/test/test_any_goal.py new file mode 100644 index 000000000000..18d49944195d --- /dev/null +++ b/worlds/ror2/test/test_any_goal.py @@ -0,0 +1,26 @@ +from . import RoR2TestBase + + +class DLCTest(RoR2TestBase): + options = { + "dlc_sotv": "true", + "victory": "any" + } + + def test_commencement_victory(self) -> None: + self.collect_all_but(["Commencement", "The Planetarium", "Hidden Realm: A Moment, Whole", "Victory"]) + self.assertBeatable(False) + self.collect_by_name("Commencement") + self.assertBeatable(True) + + def test_planetarium_victory(self) -> None: + self.collect_all_but(["Commencement", "The Planetarium", "Hidden Realm: A Moment, Whole", "Victory"]) + self.assertBeatable(False) + self.collect_by_name("The Planetarium") + self.assertBeatable(True) + + def test_moment_whole_victory(self) -> None: + self.collect_all_but(["Commencement", "The Planetarium", "Hidden Realm: A Moment, Whole", "Victory"]) + self.assertBeatable(False) + self.collect_by_name("Hidden Realm: A Moment, Whole") + self.assertBeatable(True) diff --git a/worlds/ror2/test/test_classic.py b/worlds/ror2/test/test_classic.py new file mode 100644 index 000000000000..90ed2302b272 --- /dev/null +++ b/worlds/ror2/test/test_classic.py @@ -0,0 +1,7 @@ +from . import RoR2TestBase + + +class ClassicTest(RoR2TestBase): + options = { + "goal": "classic", + } diff --git a/worlds/ror2/test/test_limbo_goal.py b/worlds/ror2/test/test_limbo_goal.py new file mode 100644 index 000000000000..f8757a917641 --- /dev/null +++ b/worlds/ror2/test/test_limbo_goal.py @@ -0,0 +1,15 @@ +from . import RoR2TestBase + + +class LimboGoalTest(RoR2TestBase): + options = { + "victory": "limbo" + } + + def test_limbo(self) -> None: + self.collect_all_but(["Hidden Realm: A Moment, Whole", "Victory"]) + self.assertFalse(self.can_reach_entrance("Hidden Realm: A Moment, Whole")) + self.assertBeatable(False) + self.collect_by_name("Hidden Realm: A Moment, Whole") + self.assertTrue(self.can_reach_entrance("Hidden Realm: A Moment, Whole")) + self.assertBeatable(True) diff --git a/worlds/ror2/test/test_mithrix_goal.py b/worlds/ror2/test/test_mithrix_goal.py new file mode 100644 index 000000000000..7ed9a2cd73a2 --- /dev/null +++ b/worlds/ror2/test/test_mithrix_goal.py @@ -0,0 +1,25 @@ +from . import RoR2TestBase + + +class MithrixGoalTest(RoR2TestBase): + options = { + "victory": "mithrix" + } + + def test_mithrix(self) -> None: + self.collect_all_but(["Commencement", "Victory"]) + self.assertFalse(self.can_reach_entrance("Commencement")) + self.assertBeatable(False) + self.collect_by_name("Commencement") + self.assertTrue(self.can_reach_entrance("Commencement")) + self.assertBeatable(True) + + def test_stage5(self) -> None: + self.collect_all_but(["Stage 4", "Sky Meadow", "Victory"]) + self.assertFalse(self.can_reach_entrance("Sky Meadow")) + self.assertBeatable(False) + self.collect_by_name("Sky Meadow") + self.assertFalse(self.can_reach_entrance("Sky Meadow")) + self.collect_by_name("Stage 4") + self.assertTrue(self.can_reach_entrance("Sky Meadow")) + self.assertBeatable(True) diff --git a/worlds/ror2/test/test_voidling_goal.py b/worlds/ror2/test/test_voidling_goal.py new file mode 100644 index 000000000000..a7520a5c5f95 --- /dev/null +++ b/worlds/ror2/test/test_voidling_goal.py @@ -0,0 +1,28 @@ +from . import RoR2TestBase + + +class VoidlingGoalTest(RoR2TestBase): + options = { + "dlc_sotv": "true", + "victory": "voidling" + } + + def test_planetarium(self) -> None: + self.collect_all_but(["The Planetarium", "Victory"]) + self.assertFalse(self.can_reach_entrance("The Planetarium")) + self.assertBeatable(False) + self.collect_by_name("The Planetarium") + self.assertTrue(self.can_reach_entrance("The Planetarium")) + self.assertBeatable(True) + + def test_void_locus_to_victory(self) -> None: + self.collect_all_but(["Void Locus", "Commencement"]) + self.assertFalse(self.can_reach_location("Victory")) + self.collect_by_name("Void Locus") + self.assertTrue(self.can_reach_entrance("Victory")) + + def test_commencement_to_victory(self) -> None: + self.collect_all_but(["Void Locus", "Commencement"]) + self.assertFalse(self.can_reach_location("Victory")) + self.collect_by_name("Commencement") + self.assertTrue(self.can_reach_location("Victory")) 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..aa825af302eb 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -1,16 +1,17 @@ import logging from typing import Dict, Any, Iterable, Optional, Union, Set, List -from BaseClasses import Region, Entrance, Location, Item, Tutorial, CollectionState, ItemClassification, MultiWorld +from BaseClasses import Region, Entrance, Location, Item, Tutorial, CollectionState, ItemClassification, MultiWorld, Group as ItemLinkGroup from Options import PerGameCommonOptions from worlds.AutoWorld import World, WebWorld from . import rules from .bundles import get_all_bundles, Bundle -from .items import item_table, create_items, ItemData, Group, items_by_group +from .items import item_table, create_items, ItemData, Group, items_by_group, get_all_filler_items, remove_limited_amount_packs from .locations import location_table, create_locations, LocationData from .logic import StardewLogic, StardewRule, True_, MAX_MONTHS from .options import StardewValleyOptions, SeasonRandomization, Goal, BundleRandomization, BundlePrice, NumberOfLuckBuffs, NumberOfMovementBuffs, \ - BackpackProgression, BuildingProgression, ExcludeGingerIsland + BackpackProgression, BuildingProgression, ExcludeGingerIsland, TrapItems +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( @@ -72,6 +74,7 @@ class StardewValleyWorld(World): def __init__(self, world: MultiWorld, player: int): super().__init__(world, player) self.all_progression_items = set() + self.filler_item_pool_names = [] def generate_early(self): self.force_change_options_if_incompatible() @@ -268,7 +271,33 @@ def generate_basic(self): pass def get_filler_item_name(self) -> str: - return "Joja Cola" + if not self.filler_item_pool_names: + self.generate_filler_item_pool_names() + return self.random.choice(self.filler_item_pool_names) + + def generate_filler_item_pool_names(self): + include_traps, exclude_island = self.get_filler_item_rules() + available_filler = get_all_filler_items(include_traps, exclude_island) + available_filler = remove_limited_amount_packs(available_filler) + self.filler_item_pool_names = [item.name for item in available_filler] + + def get_filler_item_rules(self): + if self.player in self.multiworld.groups: + link_group: ItemLinkGroup = self.multiworld.groups[self.player] + include_traps = True + exclude_island = False + for player in link_group["players"]: + player_options = self.multiworld.worlds[player].options + if self.multiworld.game[player] != self.game: + + continue + if player_options.trap_items == TrapItems.option_no_traps: + include_traps = False + if player_options.exclude_ginger_island == ExcludeGingerIsland.option_true: + exclude_island = True + return include_traps, exclude_island + else: + return self.options.trap_items != TrapItems.option_no_traps, self.options.exclude_ginger_island == ExcludeGingerIsland.option_true def fill_slot_data(self) -> Dict[str, Any]: diff --git a/worlds/stardew_valley/data/bundle_data.py b/worlds/stardew_valley/data/bundle_data.py index 8a1a6a5bcf53..183383ccbf3a 100644 --- a/worlds/stardew_valley/data/bundle_data.py +++ b/worlds/stardew_valley/data/bundle_data.py @@ -303,8 +303,7 @@ def __lt__(self, other): river_fish_items = [chub, catfish, rainbow_trout, lingcod, walleye, perch, pike, bream, salmon, sunfish, tiger_trout, shad, smallmouth_bass, dorado] -lake_fish_items = [chub, rainbow_trout, lingcod, walleye, perch, carp, midnight_carp, - largemouth_bass, sturgeon, bullhead, midnight_carp] +lake_fish_items = [chub, rainbow_trout, lingcod, walleye, perch, carp, midnight_carp, largemouth_bass, sturgeon, bullhead] ocean_fish_items = [tilapia, pufferfish, tuna, super_cucumber, flounder, anchovy, sardine, red_mullet, herring, eel, octopus, red_snapper, squid, sea_cucumber, albacore, halibut] night_fish_items = [walleye, bream, super_cucumber, eel, squid, midnight_carp] 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..1f0735f4aebc 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]): @@ -468,10 +468,6 @@ def fill_with_resource_packs_and_traps(item_factory: StardewItemFactory, options items_already_added: List[Item], number_locations: int) -> List[Item]: include_traps = options.trap_items != TrapItems.option_no_traps - all_filler_packs = [pack for pack in items_by_group[Group.RESOURCE_PACK]] - all_filler_packs.extend(items_by_group[Group.TRASH]) - if include_traps: - all_filler_packs.extend(items_by_group[Group.TRAP]) items_already_added_names = [item.name for item in items_already_added] useful_resource_packs = [pack for pack in items_by_group[Group.RESOURCE_PACK_USEFUL] if pack.name not in items_already_added_names] @@ -484,8 +480,9 @@ def fill_with_resource_packs_and_traps(item_factory: StardewItemFactory, options if include_traps: priority_filler_items.extend(trap_items) - all_filler_packs = remove_excluded_packs(all_filler_packs, options) - priority_filler_items = remove_excluded_packs(priority_filler_items, options) + exclude_ginger_island = options.exclude_ginger_island == ExcludeGingerIsland.option_true + all_filler_packs = get_all_filler_items(include_traps, exclude_ginger_island) + priority_filler_items = remove_excluded_packs(priority_filler_items, exclude_ginger_island) number_priority_items = len(priority_filler_items) required_resource_pack = number_locations - len(items_already_added) @@ -519,8 +516,21 @@ def fill_with_resource_packs_and_traps(item_factory: StardewItemFactory, options return items -def remove_excluded_packs(packs, options: StardewValleyOptions): +def remove_excluded_packs(packs, exclude_ginger_island: bool): included_packs = [pack for pack in packs if Group.DEPRECATED not in pack.groups] - if options.exclude_ginger_island == ExcludeGingerIsland.option_true: + if exclude_ginger_island: included_packs = [pack for pack in included_packs if Group.GINGER_ISLAND not in pack.groups] return included_packs + + +def remove_limited_amount_packs(packs): + return [pack for pack in packs if Group.MAXIMUM_ONE not in pack.groups and Group.EXACTLY_TWO not in pack.groups] + + +def get_all_filler_items(include_traps: bool, exclude_ginger_island: bool): + all_filler_packs = [pack for pack in items_by_group[Group.RESOURCE_PACK]] + all_filler_packs.extend(items_by_group[Group.TRASH]) + if include_traps: + all_filler_packs.extend(items_by_group[Group.TRAP]) + all_filler_packs = remove_excluded_packs(all_filler_packs, exclude_ginger_island) + return all_filler_packs 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/TestItemLink.py b/worlds/stardew_valley/test/TestItemLink.py new file mode 100644 index 000000000000..f55ab8ca347d --- /dev/null +++ b/worlds/stardew_valley/test/TestItemLink.py @@ -0,0 +1,100 @@ +from . import SVTestBase +from .. import options, item_table, Group + +max_iterations = 2000 + + +class TestItemLinksEverythingIncluded(SVTestBase): + options = {options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, + options.TrapItems.internal_name: options.TrapItems.option_medium} + + def test_filler_of_all_types_generated(self): + max_number_filler = 115 + filler_generated = [] + at_least_one_trap = False + at_least_one_island = False + for i in range(0, max_iterations): + filler = self.multiworld.worlds[1].get_filler_item_name() + if filler in filler_generated: + continue + filler_generated.append(filler) + self.assertNotIn(Group.MAXIMUM_ONE, item_table[filler].groups) + self.assertNotIn(Group.EXACTLY_TWO, item_table[filler].groups) + if Group.TRAP in item_table[filler].groups: + at_least_one_trap = True + if Group.GINGER_ISLAND in item_table[filler].groups: + at_least_one_island = True + if len(filler_generated) >= max_number_filler: + break + self.assertTrue(at_least_one_trap) + self.assertTrue(at_least_one_island) + self.assertGreaterEqual(len(filler_generated), max_number_filler) + + +class TestItemLinksNoIsland(SVTestBase): + options = {options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, + options.TrapItems.internal_name: options.TrapItems.option_medium} + + def test_filler_has_no_island_but_has_traps(self): + max_number_filler = 109 + filler_generated = [] + at_least_one_trap = False + for i in range(0, max_iterations): + filler = self.multiworld.worlds[1].get_filler_item_name() + if filler in filler_generated: + continue + filler_generated.append(filler) + self.assertNotIn(Group.GINGER_ISLAND, item_table[filler].groups) + self.assertNotIn(Group.MAXIMUM_ONE, item_table[filler].groups) + self.assertNotIn(Group.EXACTLY_TWO, item_table[filler].groups) + if Group.TRAP in item_table[filler].groups: + at_least_one_trap = True + if len(filler_generated) >= max_number_filler: + break + self.assertTrue(at_least_one_trap) + self.assertGreaterEqual(len(filler_generated), max_number_filler) + + +class TestItemLinksNoTraps(SVTestBase): + options = {options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, + options.TrapItems.internal_name: options.TrapItems.option_no_traps} + + def test_filler_has_no_traps_but_has_island(self): + max_number_filler = 100 + filler_generated = [] + at_least_one_island = False + for i in range(0, max_iterations): + filler = self.multiworld.worlds[1].get_filler_item_name() + if filler in filler_generated: + continue + filler_generated.append(filler) + self.assertNotIn(Group.TRAP, item_table[filler].groups) + self.assertNotIn(Group.MAXIMUM_ONE, item_table[filler].groups) + self.assertNotIn(Group.EXACTLY_TWO, item_table[filler].groups) + if Group.GINGER_ISLAND in item_table[filler].groups: + at_least_one_island = True + if len(filler_generated) >= max_number_filler: + break + self.assertTrue(at_least_one_island) + self.assertGreaterEqual(len(filler_generated), max_number_filler) + + +class TestItemLinksNoTrapsAndIsland(SVTestBase): + options = {options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_true, + options.TrapItems.internal_name: options.TrapItems.option_no_traps} + + def test_filler_generated_without_island_or_traps(self): + max_number_filler = 94 + filler_generated = [] + for i in range(0, max_iterations): + filler = self.multiworld.worlds[1].get_filler_item_name() + if filler in filler_generated: + continue + filler_generated.append(filler) + self.assertNotIn(Group.GINGER_ISLAND, item_table[filler].groups) + self.assertNotIn(Group.TRAP, item_table[filler].groups) + self.assertNotIn(Group.MAXIMUM_ONE, item_table[filler].groups) + self.assertNotIn(Group.EXACTLY_TWO, item_table[filler].groups) + if len(filler_generated) >= max_number_filler: + break + self.assertGreaterEqual(len(filler_generated), max_number_filler) 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/timespinner/Locations.py b/worlds/timespinner/Locations.py index 70c76b863842..7b378b4637fa 100644 --- a/worlds/timespinner/Locations.py +++ b/worlds/timespinner/Locations.py @@ -1,4 +1,4 @@ -from typing import List, Tuple, Optional, Callable, NamedTuple +from typing import List, Optional, Callable, NamedTuple from BaseClasses import MultiWorld, CollectionState from .Options import is_option_enabled from .PreCalculatedWeights import PreCalculatedWeights @@ -11,11 +11,11 @@ class LocationData(NamedTuple): region: str name: str code: Optional[int] - rule: Callable[[CollectionState], bool] = lambda state: True + rule: Optional[Callable[[CollectionState], bool]] = None def get_location_datas(world: Optional[MultiWorld], player: Optional[int], - precalculated_weights: PreCalculatedWeights) -> Tuple[LocationData, ...]: + precalculated_weights: PreCalculatedWeights) -> List[LocationData]: flooded: PreCalculatedWeights = precalculated_weights logic = TimespinnerLogic(world, player, precalculated_weights) @@ -88,9 +88,9 @@ def get_location_datas(world: Optional[MultiWorld], player: Optional[int], LocationData('Military Fortress (hangar)', 'Military Fortress: Soldiers bridge', 1337060), LocationData('Military Fortress (hangar)', 'Military Fortress: Giantess room', 1337061), LocationData('Military Fortress (hangar)', 'Military Fortress: Giantess bridge', 1337062), - LocationData('Military Fortress (hangar)', 'Military Fortress: B door chest 2', 1337063, lambda state: logic.has_doublejump(state) and logic.has_keycard_B(state)), - LocationData('Military Fortress (hangar)', 'Military Fortress: B door chest 1', 1337064, lambda state: logic.has_doublejump(state) and logic.has_keycard_B(state)), - LocationData('Military Fortress (hangar)', 'Military Fortress: Pedestal', 1337065, lambda state: logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state)), + LocationData('Military Fortress (hangar)', 'Military Fortress: B door chest 2', 1337063, lambda state: logic.has_keycard_B(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))), + LocationData('Military Fortress (hangar)', 'Military Fortress: B door chest 1', 1337064, lambda state: logic.has_keycard_B(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))), + LocationData('Military Fortress (hangar)', 'Military Fortress: Pedestal', 1337065, lambda state: state.has('Water Mask', player) if flooded.flood_lab else (logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state))), LocationData('The lab', 'Lab: Coffee break', 1337066), LocationData('The lab', 'Lab: Lower trash right', 1337067, logic.has_doublejump), LocationData('The lab', 'Lab: Lower trash left', 1337068, logic.has_upwarddash), @@ -139,17 +139,17 @@ def get_location_datas(world: Optional[MultiWorld], player: Optional[int], LocationData('Lower Lake Serene', 'Lake Serene (Lower): Under the eels', 1337106), LocationData('Lower Lake Serene', 'Lake Serene (Lower): Water spikes room', 1337107), LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater secret', 1337108, logic.can_break_walls), - LocationData('Lower Lake Serene', 'Lake Serene (Lower): T chest', 1337109, lambda state: not flooded.dry_lake_serene or logic.has_doublejump_of_npc(state)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): T chest', 1337109, lambda state: flooded.flood_lake_serene or logic.has_doublejump_of_npc(state)), LocationData('Lower Lake Serene', 'Lake Serene (Lower): Past the eels', 1337110), - LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater pedestal', 1337111, lambda state: not flooded.dry_lake_serene or logic.has_doublejump(state)), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Shroom jump room', 1337112, lambda state: not flooded.flood_maw or logic.has_doublejump(state)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater pedestal', 1337111, lambda state: flooded.flood_lake_serene or logic.has_doublejump(state)), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Shroom jump room', 1337112, lambda state: flooded.flood_maw or logic.has_doublejump(state)), LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Secret room', 1337113, lambda state: logic.can_break_walls(state) and (not flooded.flood_maw or state.has('Water Mask', player))), LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Bottom left room', 1337114, lambda state: not flooded.flood_maw or state.has('Water Mask', player)), LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Single shroom room', 1337115), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 1', 1337116, lambda state: logic.has_forwarddash_doublejump(state) or flooded.flood_maw), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 2', 1337117, lambda state: logic.has_forwarddash_doublejump(state) or flooded.flood_maw), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 3', 1337118, lambda state: logic.has_forwarddash_doublejump(state) or flooded.flood_maw), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 4', 1337119, lambda state: logic.has_forwarddash_doublejump(state) or flooded.flood_maw), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 1', 1337116, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 2', 1337117, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 3', 1337118, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 4', 1337119, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Pedestal', 1337120, lambda state: not flooded.flood_maw or state.has('Water Mask', player)), LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Last chance before Maw', 1337121, lambda state: state.has('Water Mask', player) if flooded.flood_maw else logic.has_doublejump(state)), LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Plasma Crystal', 1337173, lambda state: state.has_any({'Gas Mask', 'Talaria Attachment'}, player) and (not flooded.flood_maw or state.has('Water Mask', player))), @@ -197,7 +197,7 @@ def get_location_datas(world: Optional[MultiWorld], player: Optional[int], LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Why not it\'s right there', 1337246), LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Conviction guarded room', 1337247), LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit secret room', 1337248, lambda state: logic.can_break_walls(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), - LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret chest', 1337249, lambda state: logic.can_break_walls(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret chest', 1337249, lambda state: logic.can_break_walls(state) and (state.has('Water Mask', player) if flooded.flood_pyramid_shaft else logic.has_doublejump(state))), LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Nightmare Door chest', 1337236, lambda state: not flooded.flood_pyramid_back or state.has('Water Mask', player)), LocationData('Ancient Pyramid (right)', 'Killed Nightmare', EventId, lambda state: state.has_all({'Timespinner Wheel', 'Timespinner Spindle', 'Timespinner Gear 1', 'Timespinner Gear 2', 'Timespinner Gear 3'}, player) and (not flooded.flood_pyramid_back or state.has('Water Mask', player))) ] @@ -271,4 +271,4 @@ def get_location_datas(world: Optional[MultiWorld], player: Optional[int], LocationData('Ifrit\'s Lair', 'Ifrit: Post fight (chest)', 1337245), ) - return tuple(location_table) + return location_table diff --git a/worlds/timespinner/Options.py b/worlds/timespinner/Options.py index 8b111849442c..f7921fcb81e0 100644 --- a/worlds/timespinner/Options.py +++ b/worlds/timespinner/Options.py @@ -54,14 +54,23 @@ class LoreChecks(Toggle): display_name = "Lore Checks" -class BossRando(Toggle): - "Shuffles the positions of all bosses." +class BossRando(Choice): + "Wheter all boss locations are shuffled, and if their damage/hp should be scaled." display_name = "Boss Randomization" + option_off = 0 + option_scaled = 1 + option_unscaled = 2 + alias_true = 1 -class BossScaling(DefaultOnToggle): - "When Boss Rando is enabled, scales the bosses' HP, XP, and ATK to the stats of the location they replace (Recommended)" - display_name = "Scale Random Boss Stats" +class EnemyRando(Choice): + "Wheter enemies will be randomized, and if their damage/hp should be scaled." + display_name = "Enemy Randomization" + option_off = 0 + option_scaled = 1 + option_unscaled = 2 + option_ryshia = 3 + alias_true = 1 class DamageRando(Choice): @@ -336,6 +345,7 @@ def rising_tide_option(location: str, with_save_point_option: bool = False) -> D class RisingTidesOverrides(OptionDict): """Odds for specific areas to be flooded or drained, only has effect when RisingTides is on. Areas that are not specified will roll with the default 33% chance of getting flooded or drained""" + display_name = "Rising Tides Overrides" schema = Schema({ **rising_tide_option("Xarion"), **rising_tide_option("Maw"), @@ -345,9 +355,10 @@ class RisingTidesOverrides(OptionDict): **rising_tide_option("CastleBasement", with_save_point_option=True), **rising_tide_option("CastleCourtyard"), **rising_tide_option("LakeDesolation"), - **rising_tide_option("LakeSerene") + **rising_tide_option("LakeSerene"), + **rising_tide_option("LakeSereneBridge"), + **rising_tide_option("Lab"), }) - display_name = "Rising Tides Overrides" default = { "Xarion": { "Dry": 67, "Flooded": 33 }, "Maw": { "Dry": 67, "Flooded": 33 }, @@ -358,6 +369,8 @@ class RisingTidesOverrides(OptionDict): "CastleCourtyard": { "Dry": 67, "Flooded": 33 }, "LakeDesolation": { "Dry": 67, "Flooded": 33 }, "LakeSerene": { "Dry": 33, "Flooded": 67 }, + "LakeSereneBridge": { "Dry": 67, "Flooded": 33 }, + "Lab": { "Dry": 67, "Flooded": 33 }, } @@ -383,6 +396,11 @@ class Traps(OptionList): default = [ "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap" ] +class PresentAccessWithWheelAndSpindle(Toggle): + """When inverted, allows using the refugee camp warp when both the Timespinner Wheel and Spindle is acquired.""" + display_name = "Past Wheel & Spindle Warp" + + # Some options that are available in the timespinner randomizer arent currently implemented timespinner_options: Dict[str, Option] = { "StartWithJewelryBox": StartWithJewelryBox, @@ -396,7 +414,7 @@ class Traps(OptionList): "Cantoran": Cantoran, "LoreChecks": LoreChecks, "BossRando": BossRando, - "BossScaling": BossScaling, + "EnemyRando": EnemyRando, "DamageRando": DamageRando, "DamageRandoOverrides": DamageRandoOverrides, "HpCap": HpCap, @@ -419,6 +437,7 @@ class Traps(OptionList): "UnchainedKeys": UnchainedKeys, "TrapChance": TrapChance, "Traps": Traps, + "PresentAccessWithWheelAndSpindle": PresentAccessWithWheelAndSpindle, "DeathLink": DeathLink, } diff --git a/worlds/timespinner/PreCalculatedWeights.py b/worlds/timespinner/PreCalculatedWeights.py index 64243e25edcc..ff7f031d3b67 100644 --- a/worlds/timespinner/PreCalculatedWeights.py +++ b/worlds/timespinner/PreCalculatedWeights.py @@ -1,4 +1,4 @@ -from typing import Tuple, Dict, Union +from typing import Tuple, Dict, Union, List from BaseClasses import MultiWorld from .Options import timespinner_options, is_option_enabled, get_option_value @@ -17,7 +17,9 @@ class PreCalculatedWeights: flood_moat: bool flood_courtyard: bool flood_lake_desolation: bool - dry_lake_serene: bool + flood_lake_serene: bool + flood_lake_serene_bridge: bool + flood_lab: bool def __init__(self, world: MultiWorld, player: int): if world and is_option_enabled(world, player, "RisingTides"): @@ -32,8 +34,9 @@ def __init__(self, world: MultiWorld, player: int): self.flood_moat, _ = self.roll_flood_setting(world, player, weights_overrrides, "CastleMoat") self.flood_courtyard, _ = self.roll_flood_setting(world, player, weights_overrrides, "CastleCourtyard") self.flood_lake_desolation, _ = self.roll_flood_setting(world, player, weights_overrrides, "LakeDesolation") - flood_lake_serene, _ = self.roll_flood_setting(world, player, weights_overrrides, "LakeSerene") - self.dry_lake_serene = not flood_lake_serene + self.flood_lake_serene, _ = self.roll_flood_setting(world, player, weights_overrrides, "LakeSerene") + self.flood_lake_serene_bridge, _ = self.roll_flood_setting(world, player, weights_overrrides, "LakeSereneBridge") + self.flood_lab, _ = self.roll_flood_setting(world, player, weights_overrrides, "Lab") else: self.flood_basement = False self.flood_basement_high = False @@ -44,30 +47,32 @@ def __init__(self, world: MultiWorld, player: int): self.flood_moat = False self.flood_courtyard = False self.flood_lake_desolation = False - self.dry_lake_serene = False + self.flood_lake_serene = True + self.flood_lake_serene_bridge = False + self.flood_lab = False self.pyramid_keys_unlock, self.present_key_unlock, self.past_key_unlock, self.time_key_unlock = \ - self.get_pyramid_keys_unlocks(world, player, self.flood_maw) + self.get_pyramid_keys_unlocks(world, player, self.flood_maw, self.flood_xarion) @staticmethod - def get_pyramid_keys_unlocks(world: MultiWorld, player: int, is_maw_flooded: bool) -> Tuple[str, str, str, str]: - present_teleportation_gates: Tuple[str, ...] = ( + def get_pyramid_keys_unlocks(world: MultiWorld, player: int, is_maw_flooded: bool, is_xarion_flooded: bool) -> Tuple[str, str, str, str]: + present_teleportation_gates: List[str] = [ "GateKittyBoss", "GateLeftLibrary", "GateMilitaryGate", "GateSealedCaves", "GateSealedSirensCave", "GateLakeDesolation" - ) + ] - past_teleportation_gates: Tuple[str, ...] = ( + past_teleportation_gates: List[str] = [ "GateLakeSereneRight", "GateAccessToPast", "GateCastleRamparts", "GateCastleKeep", "GateRoyalTowers", "GateCavesOfBanishment" - ) + ] ancient_pyramid_teleportation_gates: Tuple[str, ...] = ( "GateGyre", @@ -84,7 +89,10 @@ def get_pyramid_keys_unlocks(world: MultiWorld, player: int, is_maw_flooded: boo ) if not is_maw_flooded: - past_teleportation_gates += ("GateMaw", ) + past_teleportation_gates.append("GateMaw") + + if not is_xarion_flooded: + present_teleportation_gates.append("GateXarion") if is_option_enabled(world, player, "Inverted"): all_gates: Tuple[str, ...] = present_teleportation_gates diff --git a/worlds/timespinner/Regions.py b/worlds/timespinner/Regions.py index 905cae867ebe..fc7535642949 100644 --- a/worlds/timespinner/Regions.py +++ b/worlds/timespinner/Regions.py @@ -1,4 +1,4 @@ -from typing import List, Set, Dict, Tuple, Optional, Callable +from typing import List, Set, Dict, Optional, Callable from BaseClasses import CollectionState, MultiWorld, Region, Entrance, Location from .Options import is_option_enabled from .Locations import LocationData, get_location_datas @@ -7,9 +7,8 @@ def create_regions_and_locations(world: MultiWorld, player: int, precalculated_weights: PreCalculatedWeights): - locationn_datas: Tuple[LocationData] = get_location_datas(world, player, precalculated_weights) - - locations_per_region: Dict[str, List[LocationData]] = split_location_datas_per_region(locationn_datas) + locations_per_region: Dict[str, List[LocationData]] = split_location_datas_per_region( + get_location_datas(world, player, precalculated_weights)) regions = [ create_region(world, player, locations_per_region, 'Menu'), @@ -32,7 +31,6 @@ def create_regions_and_locations(world: MultiWorld, player: int, precalculated_w create_region(world, player, locations_per_region, 'The lab (upper)'), create_region(world, player, locations_per_region, 'Emperors tower'), create_region(world, player, locations_per_region, 'Skeleton Shaft'), - create_region(world, player, locations_per_region, 'Sealed Caves (upper)'), create_region(world, player, locations_per_region, 'Sealed Caves (Xarion)'), create_region(world, player, locations_per_region, 'Refugee Camp'), create_region(world, player, locations_per_region, 'Forest'), @@ -63,7 +61,7 @@ def create_regions_and_locations(world: MultiWorld, player: int, precalculated_w if __debug__: throwIfAnyLocationIsNotAssignedToARegion(regions, locations_per_region.keys()) - + world.regions += regions connectStartingRegion(world, player) @@ -71,9 +69,9 @@ def create_regions_and_locations(world: MultiWorld, player: int, precalculated_w flooded: PreCalculatedWeights = precalculated_weights logic = TimespinnerLogic(world, player, precalculated_weights) - connect(world, player, 'Lake desolation', 'Lower lake desolation', lambda state: logic.has_timestop(state) or state.has('Talaria Attachment', player) or flooded.flood_lake_desolation) + connect(world, player, 'Lake desolation', 'Lower lake desolation', lambda state: flooded.flood_lake_desolation or logic.has_timestop(state) or state.has('Talaria Attachment', player)) connect(world, player, 'Lake desolation', 'Upper lake desolation', lambda state: logic.has_fire(state) and state.can_reach('Upper Lake Serene', 'Region', player)) - connect(world, player, 'Lake desolation', 'Skeleton Shaft', lambda state: logic.has_doublejump(state) or flooded.flood_lake_desolation) + connect(world, player, 'Lake desolation', 'Skeleton Shaft', lambda state: flooded.flood_lake_desolation or logic.has_doublejump(state)) connect(world, player, 'Lake desolation', 'Space time continuum', logic.has_teleport) connect(world, player, 'Upper lake desolation', 'Lake desolation') connect(world, player, 'Upper lake desolation', 'Eastern lake desolation') @@ -109,40 +107,38 @@ def create_regions_and_locations(world: MultiWorld, player: int, precalculated_w connect(world, player, 'Military Fortress', 'Temporal Gyre', lambda state: state.has('Timespinner Wheel', player)) connect(world, player, 'Military Fortress', 'Military Fortress (hangar)', logic.has_doublejump) connect(world, player, 'Military Fortress (hangar)', 'Military Fortress') - connect(world, player, 'Military Fortress (hangar)', 'The lab', lambda state: logic.has_keycard_B(state) and logic.has_doublejump(state)) + connect(world, player, 'Military Fortress (hangar)', 'The lab', lambda state: logic.has_keycard_B(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))) connect(world, player, 'Temporal Gyre', 'Military Fortress') connect(world, player, 'The lab', 'Military Fortress') connect(world, player, 'The lab', 'The lab (power off)', logic.has_doublejump_of_npc) - connect(world, player, 'The lab (power off)', 'The lab') + connect(world, player, 'The lab (power off)', 'The lab', lambda state: not flooded.flood_lab or state.has('Water Mask', player)) connect(world, player, 'The lab (power off)', 'The lab (upper)', logic.has_forwarddash_doublejump) connect(world, player, 'The lab (upper)', 'The lab (power off)') connect(world, player, 'The lab (upper)', 'Emperors tower', logic.has_forwarddash_doublejump) connect(world, player, 'The lab (upper)', 'Ancient Pyramid (entrance)', lambda state: state.has_all({'Timespinner Wheel', 'Timespinner Spindle', 'Timespinner Gear 1', 'Timespinner Gear 2', 'Timespinner Gear 3'}, player)) connect(world, player, 'Emperors tower', 'The lab (upper)') connect(world, player, 'Skeleton Shaft', 'Lake desolation') - connect(world, player, 'Skeleton Shaft', 'Sealed Caves (upper)', logic.has_keycard_A) + connect(world, player, 'Skeleton Shaft', 'Sealed Caves (Xarion)', logic.has_keycard_A) connect(world, player, 'Skeleton Shaft', 'Space time continuum', logic.has_teleport) - connect(world, player, 'Sealed Caves (upper)', 'Skeleton Shaft') - connect(world, player, 'Sealed Caves (upper)', 'Sealed Caves (Xarion)', lambda state: logic.has_teleport(state) or logic.has_doublejump(state)) - connect(world, player, 'Sealed Caves (Xarion)', 'Sealed Caves (upper)', logic.has_doublejump) + connect(world, player, 'Sealed Caves (Xarion)', 'Skeleton Shaft') connect(world, player, 'Sealed Caves (Xarion)', 'Space time continuum', logic.has_teleport) connect(world, player, 'Refugee Camp', 'Forest') - #connect(world, player, 'Refugee Camp', 'Library', lambda state: not is_option_enabled(world, player, "Inverted")) + connect(world, player, 'Refugee Camp', 'Library', lambda state: is_option_enabled(world, player, "Inverted") and is_option_enabled(world, player, "PresentAccessWithWheelAndSpindle") and state.has_all({'Timespinner Wheel', 'Timespinner Spindle'}, player)) connect(world, player, 'Refugee Camp', 'Space time continuum', logic.has_teleport) connect(world, player, 'Forest', 'Refugee Camp') - connect(world, player, 'Forest', 'Left Side forest Caves', lambda state: state.has('Talaria Attachment', player) or logic.has_timestop(state)) + connect(world, player, 'Forest', 'Left Side forest Caves', lambda state: flooded.flood_lake_serene_bridge or state.has('Talaria Attachment', player) or logic.has_timestop(state)) connect(world, player, 'Forest', 'Caves of Banishment (Sirens)') connect(world, player, 'Forest', 'Castle Ramparts') connect(world, player, 'Left Side forest Caves', 'Forest') connect(world, player, 'Left Side forest Caves', 'Upper Lake Serene', logic.has_timestop) - connect(world, player, 'Left Side forest Caves', 'Lower Lake Serene', lambda state: state.has('Water Mask', player) or flooded.dry_lake_serene) + connect(world, player, 'Left Side forest Caves', 'Lower Lake Serene', lambda state: not flooded.flood_lake_serene or state.has('Water Mask', player)) connect(world, player, 'Left Side forest Caves', 'Space time continuum', logic.has_teleport) connect(world, player, 'Upper Lake Serene', 'Left Side forest Caves') - connect(world, player, 'Upper Lake Serene', 'Lower Lake Serene', lambda state: state.has('Water Mask', player) or flooded.dry_lake_serene) + connect(world, player, 'Upper Lake Serene', 'Lower Lake Serene', lambda state: not flooded.flood_lake_serene or state.has('Water Mask', player)) connect(world, player, 'Lower Lake Serene', 'Upper Lake Serene') connect(world, player, 'Lower Lake Serene', 'Left Side forest Caves') - connect(world, player, 'Lower Lake Serene', 'Caves of Banishment (upper)', lambda state: not flooded.dry_lake_serene or logic.has_doublejump(state)) - connect(world, player, 'Caves of Banishment (upper)', 'Upper Lake Serene', lambda state: state.has('Water Mask', player) or flooded.dry_lake_serene) + connect(world, player, 'Lower Lake Serene', 'Caves of Banishment (upper)', lambda state: flooded.flood_lake_serene or logic.has_doublejump(state)) + connect(world, player, 'Caves of Banishment (upper)', 'Lower Lake Serene', lambda state: not flooded.flood_lake_serene or state.has('Water Mask', player)) connect(world, player, 'Caves of Banishment (upper)', 'Caves of Banishment (Maw)', lambda state: logic.has_doublejump(state) or state.has_any({'Gas Mask', 'Talaria Attachment'} or logic.has_teleport(state), player)) connect(world, player, 'Caves of Banishment (upper)', 'Space time continuum', logic.has_teleport) connect(world, player, 'Caves of Banishment (Maw)', 'Caves of Banishment (upper)', lambda state: logic.has_doublejump(state) if not flooded.flood_maw else state.has('Water Mask', player)) @@ -153,7 +149,7 @@ def create_regions_and_locations(world: MultiWorld, player: int, precalculated_w connect(world, player, 'Castle Ramparts', 'Castle Keep') connect(world, player, 'Castle Ramparts', 'Space time continuum', logic.has_teleport) connect(world, player, 'Castle Keep', 'Castle Ramparts') - connect(world, player, 'Castle Keep', 'Castle Basement', lambda state: state.has('Water Mask', player) or not flooded.flood_basement) + connect(world, player, 'Castle Keep', 'Castle Basement', lambda state: not flooded.flood_basement or state.has('Water Mask', player)) connect(world, player, 'Castle Keep', 'Royal towers (lower)', logic.has_doublejump) connect(world, player, 'Castle Keep', 'Space time continuum', logic.has_teleport) connect(world, player, 'Royal towers (lower)', 'Castle Keep') @@ -165,14 +161,15 @@ def create_regions_and_locations(world: MultiWorld, player: int, precalculated_w #connect(world, player, 'Ancient Pyramid (entrance)', 'The lab (upper)', lambda state: not is_option_enabled(world, player, "EnterSandman")) connect(world, player, 'Ancient Pyramid (entrance)', 'Ancient Pyramid (left)', logic.has_doublejump) connect(world, player, 'Ancient Pyramid (left)', 'Ancient Pyramid (entrance)') - connect(world, player, 'Ancient Pyramid (left)', 'Ancient Pyramid (right)', lambda state: logic.has_upwarddash(state) or flooded.flood_pyramid_shaft) - connect(world, player, 'Ancient Pyramid (right)', 'Ancient Pyramid (left)', lambda state: logic.has_upwarddash(state) or flooded.flood_pyramid_shaft) + connect(world, player, 'Ancient Pyramid (left)', 'Ancient Pyramid (right)', lambda state: flooded.flood_pyramid_shaft or logic.has_upwarddash(state)) + connect(world, player, 'Ancient Pyramid (right)', 'Ancient Pyramid (left)', lambda state: flooded.flood_pyramid_shaft or logic.has_upwarddash(state)) connect(world, player, 'Space time continuum', 'Lake desolation', lambda state: logic.can_teleport_to(state, "Present", "GateLakeDesolation")) connect(world, player, 'Space time continuum', 'Lower lake desolation', lambda state: logic.can_teleport_to(state, "Present", "GateKittyBoss")) connect(world, player, 'Space time continuum', 'Library', lambda state: logic.can_teleport_to(state, "Present", "GateLeftLibrary")) connect(world, player, 'Space time continuum', 'Varndagroth tower right (lower)', lambda state: logic.can_teleport_to(state, "Present", "GateMilitaryGate")) connect(world, player, 'Space time continuum', 'Skeleton Shaft', lambda state: logic.can_teleport_to(state, "Present", "GateSealedCaves")) connect(world, player, 'Space time continuum', 'Sealed Caves (Sirens)', lambda state: logic.can_teleport_to(state, "Present", "GateSealedSirensCave")) + connect(world, player, 'Space time continuum', 'Sealed Caves (Xarion)', lambda state: logic.can_teleport_to(state, "Present", "GateXarion")) connect(world, player, 'Space time continuum', 'Upper Lake Serene', lambda state: logic.can_teleport_to(state, "Past", "GateLakeSereneLeft")) connect(world, player, 'Space time continuum', 'Left Side forest Caves', lambda state: logic.can_teleport_to(state, "Past", "GateLakeSereneRight")) connect(world, player, 'Space time continuum', 'Refugee Camp', lambda state: logic.can_teleport_to(state, "Past", "GateAccessToPast")) @@ -204,12 +201,13 @@ def throwIfAnyLocationIsNotAssignedToARegion(regions: List[Region], regionNames: def create_location(player: int, location_data: LocationData, region: Region) -> Location: location = Location(player, location_data.name, location_data.code, region) - location.access_rule = location_data.rule + + if location_data.rule: + location.access_rule = location_data.rule if id is None: location.event = True location.locked = True - return location @@ -220,7 +218,6 @@ def create_region(world: MultiWorld, player: int, locations_per_region: Dict[str for location_data in locations_per_region[name]: location = create_location(player, location_data, region) region.locations.append(location) - return region @@ -237,11 +234,9 @@ def connectStartingRegion(world: MultiWorld, player: int): menu_to_tutorial = Entrance(player, 'Tutorial', menu) menu_to_tutorial.connect(tutorial) menu.exits.append(menu_to_tutorial) - tutorial_to_start = Entrance(player, 'Start Game', tutorial) tutorial_to_start.connect(starting_region) tutorial.exits.append(tutorial_to_start) - teleport_back_to_start = Entrance(player, 'Teleport back to start', space_time_continuum) teleport_back_to_start.connect(starting_region) space_time_continuum.exits.append(teleport_back_to_start) @@ -249,7 +244,7 @@ def connectStartingRegion(world: MultiWorld, player: int): def connect(world: MultiWorld, player: int, source: str, target: str, rule: Optional[Callable[[CollectionState], bool]] = None): - + sourceRegion = world.get_region(source, player) targetRegion = world.get_region(target, player) @@ -257,15 +252,13 @@ def connect(world: MultiWorld, player: int, source: str, target: str, if rule: connection.access_rule = rule - sourceRegion.exits.append(connection) connection.connect(targetRegion) -def split_location_datas_per_region(locations: Tuple[LocationData, ...]) -> Dict[str, List[LocationData]]: +def split_location_datas_per_region(locations: List[LocationData]) -> Dict[str, List[LocationData]]: per_region: Dict[str, List[LocationData]] = {} for location in locations: per_region.setdefault(location.region, []).append(location) - - return per_region + return per_region \ No newline at end of file diff --git a/worlds/timespinner/__init__.py b/worlds/timespinner/__init__.py index 24230862bdf6..ff7b3515e605 100644 --- a/worlds/timespinner/__init__.py +++ b/worlds/timespinner/__init__.py @@ -39,9 +39,9 @@ class TimespinnerWorld(World): option_definitions = timespinner_options game = "Timespinner" topology_present = True - data_version = 11 + data_version = 12 web = TimespinnerWebWorld() - required_client_version = (0, 3, 7) + required_client_version = (0, 4, 2) item_name_to_id = {name: data.code for name, data in item_table.items()} location_name_to_id = {location.name: location.code for location in get_location_datas(None, None, None)} @@ -108,7 +108,9 @@ def fill_slot_data(self) -> Dict[str, object]: slot_data["CastleMoat"] = self.precalculated_weights.flood_moat slot_data["CastleCourtyard"] = self.precalculated_weights.flood_courtyard slot_data["LakeDesolation"] = self.precalculated_weights.flood_lake_desolation - slot_data["DryLakeSerene"] = self.precalculated_weights.dry_lake_serene + slot_data["DryLakeSerene"] = not self.precalculated_weights.flood_lake_serene + slot_data["LakeSereneBridge"] = self.precalculated_weights.flood_lake_serene_bridge + slot_data["Lab"] = self.precalculated_weights.flood_lab return slot_data @@ -144,8 +146,12 @@ def write_spoiler_header(self, spoiler_handle: TextIO) -> None: flooded_areas.append("Castle Courtyard") if self.precalculated_weights.flood_lake_desolation: flooded_areas.append("Lake Desolation") - if not self.precalculated_weights.dry_lake_serene: + if self.precalculated_weights.flood_lake_serene: flooded_areas.append("Lake Serene") + if self.precalculated_weights.flood_lake_serene_bridge: + flooded_areas.append("Lake Serene Bridge") + if self.precalculated_weights.flood_lab: + flooded_areas.append("Lab") if len(flooded_areas) == 0: flooded_areas_string: str = "None" @@ -220,15 +226,18 @@ def get_excluded_items(self) -> Set[str]: def assign_starter_items(self, excluded_items: Set[str]) -> None: non_local_items: Set[str] = self.multiworld.non_local_items[self.player].value + local_items: Set[str] = self.multiworld.local_items[self.player].value - local_starter_melee_weapons = tuple(item for item in starter_melee_weapons if item not in non_local_items) + local_starter_melee_weapons = tuple(item for item in starter_melee_weapons if + item in local_items or not item in non_local_items) if not local_starter_melee_weapons: if 'Plasma Orb' in non_local_items: raise Exception("Atleast one melee orb must be local") else: local_starter_melee_weapons = ('Plasma Orb',) - local_starter_spells = tuple(item for item in starter_spells if item not in non_local_items) + local_starter_spells = tuple(item for item in starter_spells if + item in local_items or not item in non_local_items) if not local_starter_spells: if 'Lightwall' in non_local_items: raise Exception("Atleast one spell must be local") 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.